【问题标题】:How to redirect stdout output of specific thread to /dev/null?如何将特定线程的 stdout 输出重定向到 /dev/null?
【发布时间】:2016-08-04 12:42:49
【问题描述】:

我有一个多线程应用程序。有一些通用的 API,标准输出上有很多打印出来的东西。

我只想要一个线程,这个打印不应该来。

这个c/linux怎么做?

谢谢 拉克什·帕特尔

【问题讨论】:

    标签: c linux pthreads printf stdout


    【解决方案1】:

    文件描述符是每个进程的资源,而不是每个线程。所以你不能只为一个线程重定向它。

    【讨论】:

      【解决方案2】:

      您可以包装printf() 并添加一些特定代码来检测您在哪个线程中,以及是否可以打印格式化文本。

      【讨论】:

        【解决方案3】:

        您可以使用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");
           } 
        }
        

        【讨论】:

          【解决方案4】:

          考虑创建一个自定义记录器并仅过滤不需要的消息。它可能看起来像这样:

          #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
          }
          

          我希望我的想法对你来说足够清楚。

          【讨论】:

          • 对不起,只是想表达一个想法,实现并不难。但是,我找到了几分钟并尝试用 C 重写我的解决方案。
          猜你喜欢
          • 2023-03-06
          • 2019-10-11
          • 2018-02-25
          • 2012-01-04
          • 2011-05-14
          • 1970-01-01
          • 2019-10-11
          • 2012-01-03
          • 2021-04-14
          相关资源
          最近更新 更多