[問題] 請教一下 popen+fgets

看板C_and_CPP (C/C++)作者 (123)時間2年前 (2022/05/31 23:02), 編輯推噓5(5011)
留言16則, 4人參與, 最新討論串1/1
板友們晚安,我想透過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://www.ptt.cc/bbs/C_and_CPP/M.1654009328.A.496.html

06/01 00:21, 2年前 , 1F
popen 會繼承父行程你沒開 pipe 的那一端的標準輸出入
06/01 00:21, 1F

06/01 00:21, 2年前 , 2F
以你開讀為例, 子行程的寫端會進 pipe, 但讀端會繼承父行程
06/01 00:21, 2F

06/01 00:23, 2年前 , 3F
因此子行程等於 poll 了鍵盤輸入 stdin
06/01 00:23, 3F

06/01 00:25, 2年前 , 4F
hmmm, 仔細想想這樣跟你直接執行好像一樣...這樣就不知道了
06/01 00:25, 4F

06/01 04:18, 2年前 , 5F
是不是卡在你的 binary stdout 的 buffer ?
06/01 04:18, 5F

06/01 04:19, 2年前 , 6F
試試看 flush 掉你 binary 輸出的 fd?
06/01 04:19, 6F

06/01 06:38, 2年前 , 7F
我忘記說明,他放很久後會輸出
06/01 06:38, 7F

06/01 06:41, 2年前 , 8F
請問我用fflush(fp),是不是已經做flush了
06/01 06:41, 8F

06/01 10:31, 2年前 , 9F
我是說 binary code 不是 test
06/01 10:31, 9F

06/01 12:15, 2年前 , 10F
喔, 結果是 buffer...查了一下 \n flush 似乎只有 terminal
06/01 12:15, 10F

06/01 12:16, 2年前 , 11F
輸出會, 如果是接去其他地方 (像這裡接到 pipe 裡) 就不會
06/01 12:16, 11F

06/01 12:16, 2年前 , 12F
原 PO 試試 binary 裡全部 printf 後都加 fflush(stdout);
06/01 12:16, 12F

06/01 12:18, 2年前 , 13F
另外之前看時沒注意, fflush 不能用在輸入串上
06/01 12:18, 13F

06/01 12:20, 2年前 , 14F
你的 test 中的 fp 是輸入, 對它 fflush 是 UB
06/01 12:20, 14F

06/05 20:59, , 15F
我在加了fflush到print後面,就可以了。謝謝
06/05 20:59, 15F

06/23 12:52, , 16F
setbuf(), setlinebuf()
06/23 12:52, 16F
文章代碼(AID): #1YbYtmIM (C_and_CPP)
文章代碼(AID): #1YbYtmIM (C_and_CPP)