我有一个多线程应用程序。有常见的API,stdout上有很多打印。
我只想要一个帖子,这个版画不应该来。
如何做这个c / linux?
由于 Rakesh Patel
答案 0 :(得分:2)
文件描述符是每个进程的资源,而不是每个线程。所以你不能只为一个线程重定向它。
答案 1 :(得分:1)
您可以包装printf()
并添加一些特定代码来检测您所在的线程,以及是否可以打印格式化文本。
答案 2 :(得分:0)
考虑创建自定义记录器,只过滤不需要的消息。它可能看起来像这样:
#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
}
我希望我的想法足够清楚。
答案 3 :(得分:0)
您可以使用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");
}
}