簡體   English   中英

如何防止stdin流在程序啟動時從關聯的文件描述符中讀取數據?

[英]How to prevent stdin stream from reading data from associated file descriptor on program start?

我正在使用select()調用來檢測程序主循環中的輸入是否存在。 這使我使用原始文件描述符(0)代替了stdin。

在這種模式下工作時,我注意到我的軟件一開始偶爾會丟失大量輸入。 我懷疑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()等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM