在下面的代码之前我做了:
创建1个管道以读取分叉进程的输出
叉()
execv()一个python脚本
然后在父进程中我做:
//set pipes to non-Blocking
File * cout_f = fdopen(cout_pipe[0], "r");
int flags = fcntl(cout_pipe[0], F_GETFL, 0);
fcntl(cout_pipe[0], F_SETFL, flags|O_NONBLOCK);
// read from pipe and send it up through a callback method
int stat;
size_t size = 0;
char buffer [ 1000 ];
do
{
while((size = fread(buffer, sizeof(char), sizeof(char)*1000, cout_f))!=0)
{
call_back_function(buffer, size);
}
}while(waitpid(child_pid, &stat, WNOHANG) != -1)
//Do 1 extra read
while((size = fread(buffer, sizeof(char), sizeof(char)*1000, cout_f))!=0)
{
call_back_function(buffer, size);
}
我遇到的问题发生在子进程打印到stdout并在刷新之前退出(通常)时。我想念管道发送的东西。
以下是我的问题:
答案 0 :(得分:2)
你不必等待。只需在阅读时发送所有内容。这就是你的代码已经做了什么。摆脱非阻塞模式;摆脱while(等待(...))条件;摆脱最后的阅读;然后执行第一个读循环直到流结束。然后调用wait()来获取退出代码。
如果进程也在stderr上产生,你需要在另一个线程中读取它,否则当stderr缓冲区填满时,它将阻塞。