C语言 poll()函数试图从jq检测标准输出

yrefmtwq  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(173)

我尝试用C编写一个函数,使用poll()检查stdin是否存在

#include <stdio.h>
#include <sys/poll.h>

\\other code

void check_stdin(){
    struct pollfd fds;
    int ret; fds.fd = 0; fds.events = POLLIN;
    ret = poll(&fds, 1, 10);
    printf("Return value: %d\n", ret);
    if(ret != 1){
        printf("stdin could not be read\n");
    }
}

这里fds.fd=0指的是STDIN的文件描述符。fds.events = POLLIN指的是有数据要读的事件。我使用了10毫秒的超时。当我运行

echo "{\"key\": 1}" | jq .key | ./test_stdin

其中test_stdin是C程序的目标文件,我得到了输出

Return value: 0
stdin could not be read

如果在STDIN中发现要读取的数据,则ret的值应为1。jq的STDOUT在此处是否不被视为./test_stdin的STDIN?

bnl4lu3b

bnl4lu3b1#

你的 shell 管道中存在争用情况。

ret = poll(&fds, 1, 10);

您告诉poll()在超时之前等待10毫秒。当您测试它时,jq在这么短的时间内没有产生任何输出(我也没有)。

Return value: 1

作为输出。
流水线中的命令都是并发运行的,它们的执行顺序取决于操作系统的调度程序。因此,最后的C程序可能实际上在jq开始执行之前就结束了。如果打算在流水线中使用的程序使用阻塞读取,它们永远不会注意到,但在非常短的超时时间内,您会看到效果。

相关问题