![](/img/trans.png)
[英]How redirect stdout (stderr) of child process to socket in winapi?
[英]how to get stdout of child process in realtime?
我想实时捕获子任务的标准输出,我的子任务是由 popen 创建的。 但我发现我的代码有很大的延迟。 下面是我的例子:
#include <stdio.h>
#include <stdint.h>
#include <thread>
#include <mutex>
#include <unistd.h>
#include <iostream>
#include <cstring>
#define BUFF_LEN (16*1024)
using namespace std;
int main()
{
char *buf = (char*)malloc(BUFF_LEN);
char cmd[128];
sprintf(cmd, "while true;do echo gg;sleep 1;done");
FILE *out = popen(cmd, "r");
if(setvbuf(out, NULL, _IONBF, 0)) perror("setvbuf");
while(1){
int len = fread(buf, 1, BUFF_LEN, out);
if(len < 0){
cout << "read error" << endl;
continue;
}
write(1, buf, len);
}
}
我试过 setvbuf 但没有运气。 如果我删除“睡眠 1”,那么 output 很快。 必须有其他地方在做缓冲。 如何让它工作?
弹出后,您可以执行以下操作:
if (fcntl(fileno(out), F_SETFL, O_NONBLOCK) < 0)
exit(1);
我现在知道为什么了。 我必须在子进程中调用 setvbuf,而不是父进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.