Come impedire flusso stdin dalla lettura dei dati dal descrittore di file associato all'avvio del programma?

StackOverflow https://stackoverflow.com/questions/3658475

Domanda

Sto usando chiamata select () per rilevare la presenza di ingresso nel ciclo principale del mio programma. Questo mi fa uso descrittore di file RAW (0) invece che da stdin.

Mentre si lavora in questo modo ho notato che il mio software perde di tanto in tanto un pezzo di ingresso all'inizio. Ho il sospetto che stdin consuma un po 'di esso su l'avvio del programma. C'è un modo per impedire questo comportamento di stdin o comunque ottenere i dati di ingresso intero?

L'effetto descritto può essere riprodotto solo con alcuni dati su standard input al momento di avvio del programma. Il mio eseguibile dovrebbe essere usato come servizio xinetd in un modo che ha sempre qualche input sulla linea di partenza.

di input standard si legge nel seguente modo:

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
  }
}
È stato utile?

Soluzione

Non mescolare cotto e carne cruda insieme. Provare a sostituire la chiamata read () con la chiamata fread equivalente ().

E 'molto probabile che fileno(stdin) inizializza l'oggetto stdin, provocando la lettura e bufferizzare alcuni input. O forse si sta già chiamando qualcosa che lo fa per inizializzare (scanf (), getchar (), ecc ...).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top