我喜欢将每个线程的stdout输出重定向到文件。以下代码将所有线程输出重定向到单个文件 -
int fd = open(<filename_threadid.txt>, <flags>)
_dup2(fd, 1)
我应该如何恢复原始标准输出,以便下一个线程能够可靠地将其标准输出映射到filename_threadid?
答案 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()
的返回值,您应该这样做。