c - 如何防止标准输入流在程序启动时从关联的文件描述符中读取数据?

标签 c linux filestream file-descriptor

我正在使用 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/

相关文章:

java - 如何将 java 堆栈跟踪的 bash 输出打印到 Linux 中的文件?

linux -/lib/libc.so.0 buildroot 错误

swift - 如何显示来自文件流的pdf数据

c# - 我的 using 语句应该放在哪里?在哪里放置try catch?

c - 为什么输入一个字符后 getchar 会等待?

c++ - 如果没有文件、objdump 或 gdb,如何知道二进制文件是否包含调试符号?

c++ - 在 C/C++ 中将字符串格式化为特定长度的多行

c - 如何检查变量是否为 C 中的 "const"限定符类型?

linux - 如何在 RPM 文件中查找文件

c# - Filestream.Read 返回值是什么意思?如何分块读取数据并进行处理?