我有一个父进程可以分叉和执行子进程,但在此之前它会通过管道将子进程的stdout路由到文件描述符cout_file
。
然后父进程通过这个管道监听子进程的stdout,如下所示:
int status;
size_t buffer_size = 0;
char buffer [1024];
do
{
LOG(1)
while( (buffer_size = fread(buffer, sizeof(char), sizeof(char)*1024, cout_file)) !=0)
{
LOG(2)
LOG(std::string(buffer, buffer_size))
}
}while(waitpid(child_pid,&status, WNOHANG) != -1);
//read one more time
LOG(3)
while( (buffer_size = fread(buffer, sizeof(char), sizeof(char)*1024, cout_file)) !=0)
{
LOG(4)
LOG(std::string(buffer, buffer_size))
}
执行的脚本(子进程)执行此操作:
sys.stdout.write("BLABLABLA")
sys.stdout.flush()
time.sleep(3) #3 seconds
exit(0)
所有这些在90%的情况下按预期工作,但是在父进程没有看到BLABLABLA
的情况下有10%的时间,即没有看到{{1}的输出} LOG(2)
如果失败,我会看到以下输出
LOG(4)
所以不知何故,脚本正在写入它的stdout,但父进程错过了它。
上面的代码已经工作了几年了,最近我注意到了这种行为,有人可以对可能出现的问题有所了解吗?