[问题] 请教一下 popen+fgets

楼主: gn00618777 (非常念旧)   2022-05-31 23:02:04
板友们晚安,我想透过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:00
popen 会继承父行程你没开 pipe 的那一端的标准输出入以你开读为例, 子行程的写端会进 pipe, 但读端会继承父行程因此子行程等于 poll 了键盘输入 stdinhmmm, 仔细想想这样跟你直接执行好像一样...这样就不知道了
作者: b0920075 (Void)   2022-06-01 04:18:00
是不是卡在你的 binary stdout 的 buffer ?试试看 flush 掉你 binary 输出的 fd?
楼主: gn00618777 (非常念旧)   2022-06-01 06:38:00
我忘记说明,他放很久后会输出请问我用fflush(fp),是不是已经做flush了
作者: b0920075 (Void)   2022-06-01 10:31:00
我是说 binary code 不是 test
作者: 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
楼主: gn00618777 (非常念旧)   2022-06-05 20:59:00
我在加了fflush到print后面,就可以了。谢谢
作者: yvb   2022-06-23 12:52:00
setbuf(), setlinebuf()

Links booklink

Contact Us: admin [ a t ] ucptt.com