作者gn00618777 (123)
看板C_and_CPP
标题[问题] 请教一下 popen+fgets
时间Tue May 31 23:02:04 2022
板友们晚安,我想透过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;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.224.106.216 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1654009328.A.496.html
1F:推 LPH66: popen 会继承父行程你没开 pipe 的那一端的标准输出入 06/01 00:21
2F:→ LPH66: 以你开读为例, 子行程的写端会进 pipe, 但读端会继承父行程 06/01 00:21
3F:→ LPH66: 因此子行程等於 poll 了键盘输入 stdin 06/01 00:23
4F:→ LPH66: hmmm, 仔细想想这样跟你直接执行好像一样...这样就不知道了 06/01 00:25
5F:推 b0920075: 是不是卡在你的 binary stdout 的 buffer ? 06/01 04:18
6F:→ b0920075: 试试看 flush 掉你 binary 输出的 fd? 06/01 04:19
7F:→ gn00618777: 我忘记说明,他放很久後会输出 06/01 06:38
8F:→ gn00618777: 请问我用fflush(fp),是不是已经做flush了 06/01 06:41
9F:推 b0920075: 我是说 binary code 不是 test 06/01 10:31
10F:推 LPH66: 喔, 结果是 buffer...查了一下 \n flush 似乎只有 terminal 06/01 12:15
11F:→ LPH66: 输出会, 如果是接去其他地方 (像这里接到 pipe 里) 就不会 06/01 12:16
12F:→ LPH66: 原 PO 试试 binary 里全部 printf 後都加 fflush(stdout); 06/01 12:16
13F:→ LPH66: 另外之前看时没注意, fflush 不能用在输入串上 06/01 12:18
14F:→ LPH66: 你的 test 中的 fp 是输入, 对它 fflush 是 UB 06/01 12:20
15F:→ gn00618777: 我在加了fflush到print後面,就可以了。谢谢 06/05 20:59
16F:推 yvb: setbuf(), setlinebuf() 06/23 12:52