当子进程不刷新其stdout时,如何从子进程读取stdout
How to read stdout from a subprocess when the latter does not flush its stdout?
在下面的代码之前我做:
-
创建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并在刷新之前退出(正常情况下)时,就会出现我所面临的问题。我想念管道里送来的东西。
以下是我的问题:
- 以上代码是否安全/正确,或者是否可以改进
- 有没有一种方法可以在子流程终止的最后一刻读取整个管道,即使它没有刷新stdout
您不必等待。只要在阅读时发送所有内容。这就是您的代码已经做的。摆脱非阻塞模式;摆脱while(等待(…))条件;去掉最后的阅读;并且仅执行第一读取循环直到流结束。然后调用wait()获取退出代码。
如果进程也在stderr上生成,则需要在另一个线程中读取,否则当stderr缓冲区时,它将阻塞。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 连接到子进程stdout的管道中的消息不完整
- 截获非终止子进程C++的stdout
- 当子进程不刷新其stdout时,如何从子进程读取stdout
- 仅重定向子进程stdin,并从stdout和stderr中删除数据