如何防止 stdin 流在程序启动时从关联的文件描述符读取数据?

发布于 2024-09-17 20:32:32 字数 728 浏览 6 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

£噩梦荏苒 2024-09-24 20:32:32

不要将熟肉和生肉混在一起。尝试用等效的 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...).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文