为每个线程重定向stdout / stderr

时间:2011-07-25 01:55:53

标签: c++ c multithreading

我喜欢将每个线程的stdout输出重定向到文件。以下代码将所有线程输出重定向到单个文件 -

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

我应该如何恢复原始标准输出,以便下一个线程能够可靠地将其标准输出映射到filename_threadid?

2 个答案:

答案 0 :(得分:7)

在所有平台上,standard streams(stdin,stdout,stderr)都是每个进程。因此,每个线程无法重定向它们。您应修改代码,以便每个线程输出到特定文件而不是标准输出。

答案 1 :(得分:1)

我在线程中使用fork()来重定向分叉进程的stdout,而“true”线程在waitpid()中。 问题是如何将文件传递到要重定向stdout的位置。 我使用全局线程池,线程将通过pthread_equal(pthread_self(),iterator)找到自己,然后在全局线程池结构中有一个outfile,程序应重定向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()的返回值,您应该这样做。