2016-08-04 3 views

答えて

2

は、ファイル記述子がないスレッドごと、プロセスごとのリソースです。したがって、1つのスレッドに対してのみリダイレクトすることはできません。

1

printf()をラップし、特定のスレッドを検出して、書式設定されたテキストを印刷する場合と印刷しない場合があります。

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 
} 

私の考えはあなたには十分であることを願っています。

+0

のために別のFDに書き込むことができます[タグ:C]質問..... – LPs

+0

申し訳ありませんが、単にアイデアを表現したかったです、実装は難しくありません。しかし、私は数分を見つけ、私の解決策をCで書き直そうとしました。 –

0

あなたはこれがある代わりにprintfののfprintfを使用し、それぞれ特定のスレッド

#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"); 
    } 
} 
関連する問題