2011-07-25 47 views
0

各スレッドのstdoutの出力をファイルにリダイレクトするのが好きです。次のコードは、単一のファイルにすべてのスレッド出力をリダイレクト -各スレッドのstdout/stderrをリダイレクト

int fd = open(<filename_threadid.txt>, <flags>) 
_dup2(fd, 1) 

次のスレッドが確実filename_threadidにその標準出力をマッピングすることができますので、どのように私は、元の標準出力を復元する必要がありますか?

+1

これは本当に危険で非標準的なようです。あなたのスレッドは、標準的な方法ではっきりと定義されたファイルに書き込むことはできませんか? –

+0

あなたはBoost.Logのような良いログフレームワークを調べるかもしれません –

答えて

6

すべてのプラットフォームでstandard streams(stdin、stdout、stderr)はプロセスごとです。そのため、スレッドごとにリダイレクトすることはできません。各スレッドがstdoutではなく特定のファイルに出力するようにコードを変更する必要があります。

1

「真の」スレッドがwaitpid()にある間に、スレッド内にfork()を使用してフォークされたプロセスのstdoutをリダイレクトします。 問題は、stdoutをリダイレクトする場所にファイルを渡す方法です。 私はグローバルスレッドプールを使用し、スレッドはpthread_equal(pthread_self(),iterator)を通してそれ自身を見つけるでしょう、そして、グローバルスレッドプール構造では、プログラムがstdoutをリダイレクトするべきアウトファイルがあります。 私の場合、tmpnam()を作成してそれをスレッド構造体に書きますが、それをどのように使うこともできます。ここで

いくつかのサンプルコードです:私は本当にその場でそれを書いた(その場で書かれた)は

pthread_t *t_cur=NULL; 
int i,pid,newout; 
char *outfile=NULL; 

for(i=0;i<MAX_THREADS;i++) 
    if(pthread_equal(pthread_self(),globals.tpool[i]->thread)) 
    break; 
if(i==MAX_THREADS) 
{ 
    printf("cannot find myself into global threads pool.\n"); 
    pthread_exit(&i); 
} 
if(globals.tpool[i]->outfile == NULL) // redirect stdout only if outfile is not set (this is specfic for my purposes) 
{ 
    outfile = globals.tpool[i]->outfile = malloc(L_tmpnam*sizeof(char)); 
    tmpnam(outfile); 
} 

if((pid = fork()) == 0) 
{ 
    if(outfile!=NULL) 
    { 
    newout = open(outfile,O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); 
    dup2(newout,STDOUT_FILENO); 
    close(newout); 
    } 
    /* your code here */ 
} 
else 
    waitpid(pid,NULL); 
pthread_exit(&i); 

、私はこのコードをテストし、そのエラーを修正するために世話をしていません。自分のライブラリへの呼び出しのために私は実際のコードを投稿しませんでした。ここでは戻り値をtmpnam()fork()open()malloc()から確認していませんでした。

関連する問題