私はマルチスレッドアプリケーションを1つ持っています。共通のAPIがあり、そのためのstdoutには多くのプリントがあります。特定のスレッドのstdout出力を/ dev/nullにリダイレクトする方法は?
私は1つのスレッドだけが欲しいです、このプリントは来ないはずです。
これを行う方法c/linux?
おかげ ラケッシュパテル
私はマルチスレッドアプリケーションを1つ持っています。共通のAPIがあり、そのためのstdoutには多くのプリントがあります。特定のスレッドのstdout出力を/ dev/nullにリダイレクトする方法は?
私は1つのスレッドだけが欲しいです、このプリントは来ないはずです。
これを行う方法c/linux?
おかげ ラケッシュパテル
は、ファイル記述子がないスレッドごと、プロセスごとのリソースです。したがって、1つのスレッドに対してのみリダイレクトすることはできません。
printf()
をラップし、特定のスレッドを検出して、書式設定されたテキストを印刷する場合と印刷しない場合があります。
カスタムロガーを作成し、不要なメッセージをフィルタリングすることを検討してください。
#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
}
私の考えはあなたには十分であることを願っています。
あなたはこれがある代わりに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");
}
}
のために別のFDに書き込むことができます[タグ:C]質問..... – LPs
申し訳ありませんが、単にアイデアを表現したかったです、実装は難しくありません。しかし、私は数分を見つけ、私の解決策をCで書き直そうとしました。 –