我试图在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: %dn", ret);
if(ret != 1){
printf("stdin could not be readn");
}
}
这里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 ?
您的shell管道中有一个竞争条件。
ret = poll(&fds, 1, 10);
你告诉poll()
在超时之前等待10毫秒。当你测试jq
时,它并没有在那么短的时间内产生任何输出(我也没有)。如果使用更长的超时,比如500毫秒,您可能会看到
Return value: 1
作为输出。
管道中的命令都是并发运行的,它们执行的顺序取决于操作系统的调度程序。所以最后的C程序可能在jq
开始执行之前就已经结束了。如果打算在管道中使用的程序使用阻塞读,它们永远不会注意到,但是由于这个非常短的超时,您可以看到效果。