管道中缺少数据

时间:2015-11-13 02:44:43

标签: c++ linux pipe

我有一个父进程可以分叉和执行子进程,但在此之前它会通过管道将子进程的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,但父进程错过了它。

上面的代码已经工作了几年了,最近我注意到了这种行为,有人可以对可能出现的问题有所了解吗?

0 个答案:

没有答案