如何将特定线程的stdout输出重定向到/ dev / null?

时间:2016-08-04 12:42:49

标签: c linux pthreads printf stdout

我有一个多线程应用程序。有常见的API,stdout上有很多打印。

我只想要一个帖子,这个版画不应该来。

如何做这个c / linux?

由于 Rakesh Patel

4 个答案:

答案 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");
   } 
}