我正在使用 select() 调用来检测程序主循环中是否存在输入。这让我使用原始文件描述符 (0) 而不是标准输入。
在这种模式下工作时,我注意到我的软件偶尔会在开始时丢失大量输入。我怀疑 stdin 在程序启动时消耗了其中的一些。有没有办法阻止 stdin 的这种行为或以其他方式获取整个输入数据?
所描述的效果只能在程序启动的那一刻用标准输入上的一些数据来重现。我的可执行文件应该用作 xinetd 服务,在开始时它总是有一些输入。
标准输入的读取方式如下:
Error processInput() {
struct timeval ktimeout;
int fd=fileno(stdin);
int maxFd=fd+1;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
ktimeout.tv_sec = 0;
ktimeout.tv_usec = 1;
int selectRv=-1;
while ((selectRv=select(maxFd, &fdset, NULL, NULL, &ktimeout)) > 0) {
int left=MAX_BUFFER_SIZE-position-1;
assert(left>0);
int bytesCount=read(fd, buffer+position, left);
//Input processing goes here
}
}
最佳答案
不要将熟肉和生肉混在一起。尝试用等效的 fread() 调用替换 read() 调用。
很可能 fileno(stdin)
正在初始化 stdin 对象,导致它读取和缓冲一些输入。或者您可能已经调用了一些导致它初始化的东西(scanf()、getchar() 等)。
关于c - 如何防止标准输入流在程序启动时从关联的文件描述符中读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658475/