我尝试用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?
1条答案
按热度按时间bnl4lu3b1#
你的 shell 管道中存在争用情况。
您告诉
poll()
在超时之前等待10毫秒。当您测试它时,jq
在这么短的时间内没有产生任何输出(我也没有)。作为输出。
流水线中的命令都是并发运行的,它们的执行顺序取决于操作系统的调度程序。因此,最后的C程序可能实际上在
jq
开始执行之前就结束了。如果打算在流水线中使用的程序使用阻塞读取,它们永远不会注意到,但在非常短的超时时间内,您会看到效果。