我正在使用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
}
}
答案 0 :(得分:1)
不要将煮熟的肉和生肉混合在一起。尝试用等效的fread()调用替换read()调用。
fileno(stdin)
很可能正在初始化stdin对象,导致它读取并缓冲一些输入。或者你可能正在调用导致它初始化的东西(scanf(),getchar()等......)。