c++ - 当子进程不刷新其标准输出时如何从子进程读取标准输出?

标签 c++ c fork pipe stdout

在下面的代码之前我做了:

  • 创建 1 个管道以读取 fork 进程的输出

  • fork()

  • 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 并在刷新之前退出(正常)时,就会出现我面临的问题。我想念管道中发送的内容。

这是我的问题:

  • 以上代码是否安全/正确或是否可以改进?
  • 有没有办法在子进程结束时读取整个管道,即使它没有刷新其标准输出?

最佳答案

您无需等待。只需在阅读时发送所有内容即可。这就是您的代码已经做的事情。摆脱非阻塞模式;摆脱 while(wait(...)) 条件;摆脱最终阅读;并只执行第一个读取循环直到流结束。然后调用 wait() 获取退出代码。

如果该进程也在 stderr 上产生,您将需要在另一个线程中读取它,否则当 stderr 缓冲区填满时,它将阻塞。

关于c++ - 当子进程不刷新其标准输出时如何从子进程读取标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25655222/

相关文章:

C++ 返回和插入二维数组对象

c++ - 应该避免还是鼓励 `using std::cin` 和 `using std::cout`?

c - fork 和管道 : does this C program contain a race condition?

c - 我如何暂停子进程并重置它

c++ - 使 TBB 管道过滤器超时

c++ - 我如何使用移动语义从类对象中创建共享指针

使用 C 创建列表和结构数组

c - 如何添加循环?

c - 如何使用 C 语言对结构中的字符名称进行排序

一组的 C++ mmap