板友们晚安,我想透过Linux C, popen执行一个binary,并获得binary的stdout
单执行binary 是正常的。会印出 start test,也会每隔3秒印出
但我如果透过另支程式 popen 加 fgets就会卡住,试着 fflush(fp)也无用,请问
有人知道是啥问题吗? 谢谢。
binary code:
int main () {
int ret = 0;
struct pollfd fds[1] = {0};
int fd = timerfd_create(CLOCK_MONOTONIC, 0);
char rbuf[1024] = {0};
struct itimerspec itval;
itval.it_interval.tv_sec = 3;
itval.it_interval.tv_nsec = 0;
itval.it_value.tv_sec = 3;
itval.it_value.tv_nsec = 0;
fd[0].fd = fd;
fds[0]│events = POLLIN;
timerfd_settime (fd, 0, &itval, NULL);
printf("start test\n");
while(1) {
ret = poll(fds, 1, -1);
if(ret < 0) {
printf("poll fail\n");
} else if(ret == 0) {
printf("time out\n");
} else {
read(fds[0].fd, &rbuf, 1024);
}
printf("finish poll\n");
}
}
test.c:
int main()
{
char line[1024] = {0};
FILE *fp = popen("./burn", "r");
fflush(fp);
while(fgets(line, 1022, fp) != NULL) {
printf("line:%s\n", line);
}
printf("123\n");
return 0;
}
作者:
LPH66 (-6.2598534e+18f)
2022-06-01 00:21:00popen 会继承父行程你没开 pipe 的那一端的标准输出入以你开读为例, 子行程的写端会进 pipe, 但读端会继承父行程因此子行程等于 poll 了键盘输入 stdinhmmm, 仔细想想这样跟你直接执行好像一样...这样就不知道了
作者:
LPH66 (-6.2598534e+18f)
2022-06-01 12:15:00喔, 结果是 buffer...查了一下 \n flush 似乎只有 terminal输出会, 如果是接去其他地方 (像这里接到 pipe 里) 就不会原 PO 试试 binary 里全部 printf 后都加 fflush(stdout);另外之前看时没注意, fflush 不能用在输入串上你的 test 中的 fp 是输入, 对它 fflush 是 UB