【发布时间】:2016-08-04 12:42:49
【问题描述】:
我有一个多线程应用程序。有一些通用的 API,标准输出上有很多打印出来的东西。
我只想要一个线程,这个打印不应该来。
这个c/linux怎么做?
谢谢 拉克什·帕特尔
【问题讨论】:
标签: c linux pthreads printf stdout
我有一个多线程应用程序。有一些通用的 API,标准输出上有很多打印出来的东西。
我只想要一个线程,这个打印不应该来。
这个c/linux怎么做?
谢谢 拉克什·帕特尔
【问题讨论】:
标签: c linux pthreads printf stdout
文件描述符是每个进程的资源,而不是每个线程。所以你不能只为一个线程重定向它。
【讨论】:
您可以包装printf() 并添加一些特定代码来检测您在哪个线程中,以及是否可以打印格式化文本。
【讨论】:
您可以使用fprintf 代替 printf 并为每个特定线程写入不同的 FD
#define CONSOLE_ENABLED (void *)(1)
#define CONSOLE_DISABLED (void *)(2)
void *Tsk_X(void *arg)
{
FILE* console = NULL;
if (arg == CONSOLE_DISABLED)
console = fopen("/dev/null", "w");
else
console = stdout // or stderr that is unbuffered
if (console != NULL)
{
fprintf(console, "Your strings");
}
}
【讨论】:
考虑创建一个自定义记录器并仅过滤不需要的消息。它可能看起来像这样:
#include <stdio.h>
#include <pthreads.h>
struct Logger
{
pthread_t blockedThreads[256];
int qty;
};
struct Logger *createLogger()
{
struct Logger *logger = (Logger *)malloc(sizeof(Logger));
logger->qty = 0;
return logger;
}
void blockThread(struct Logger *logger, pthread_t thread)
{
for (int i = 0; i < logger->qty; ++i) {
if (logger->blockedThread[i] == thread {
return;
}
}
logger->blockedThreads[logger->qty] = thread;
logger->qty++;
}
void log(struct Logger *logger, const char *message)
{
for (int i = 0; i < logger->qty; ++i) {
if (logger->blockedThread[i] == pthread_self()) {
return;
}
}
// DO REAL LOGGING HERE
}
我希望我的想法对你来说足够清楚。
【讨论】: