Я использую fork()
внутри потока для перенаправления stdout разветвленного процесса, пока "истинный" поток находится в waitpid()
.
Проблема в том, как передать файл, куда вы хотите перенаправить стандартный вывод.
Я использую глобальный пул потоков, и поток находит себя через pthread_equal(pthread_self(),iterator)
, затем в структуре глобального пула потоков есть выходной файл, куда программа должна перенаправить стандартный вывод.
В моем случае я создаю 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()
, что вы должны сделать.