如何防止 stdin 流在程序启动时从关联的文件描述符读取数据?
我正在使用 select() 调用来检测程序主周期中输入的存在。这使我使用原始文件描述符 (0) 而不是标准输入。
在这种模式下工作时,我注意到我的软件偶尔会在开始时丢失大量输入。我怀疑标准输入在程序启动时消耗了其中的一些。有没有办法防止 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
}
}
I'm using select() call to detect input presence in the main cycle of my program. This makes me use raw file descriptor (0) instead of stdin.
While working in this mode I've noticed that my software occasionally loses a chunk of input at the beginning. I suspect that stdin consumes some of it on the program start. Is there a way to prevent this behavior of stdin or otherwise get the whole input data?
The effect described can be reproduced only with some data on standard input at the very moment of program start. My executable should be used as xinetd service in a way that it always has some input on the start.
Standard input is read in the following way:
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
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不要将熟肉和生肉混在一起。尝试用等效的 fread() 调用替换 read() 调用。
fileno(stdin) 很可能正在初始化 stdin 对象,导致它读取并缓冲一些输入。或者也许您已经在调用一些导致其初始化的内容(scanf()、getchar() 等)。
Don't mix cooked and raw meat together. Try replacing the read() call with the equivalent fread() call.
It is very likely that
fileno(stdin)
is initializing the stdin object, causing it to read and buffer some input. Or perhaps you are already calling something that causes it to initialize (scanf(), getchar(), etc...).