下面的代码之前,我做:如何从子进程读取标准输出,当后者不刷新其标准输出?
创建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?
只要数据没有被刷新,就不会写入,因此没办法! – 2014-09-04 00:05:12
同意!但是,一旦蟒蛇子过程死亡,管子是否不应该自动冲洗? – Kam 2014-09-04 00:06:13
@Kam这取决于它是如何死亡。如果它正常退出,所有的'stdio'缓冲区都应该被刷新。如果中止,可能不是。 – EJP 2014-09-04 01:20:20