2013-04-26 23 views
7

Ho cercato ma non ho ottenuto una risposta pertinente a questa domanda, sto lavorando su una macchina Linux, volevo controllare se lo stream di input standard contiene un carattere, senza rimuovere i caratteri dallo stream.Verifica se stdin è vuoto

+1

C++ o C? La tua domanda è contrassegnata da entrambi. –

+3

Non sono sicuro che la tua domanda abbia un significato ben definito. Immagina che * stdin * sia una pipe (da un comando che impiega anni a sputare il suo primo carattere sul suo * stdout *). Quello che potresti fare è chiamare [sondaggio (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) usando 'STDIN_FILENO' (cioè 0) come descrittore di file. Quindi controlla se * stdin * è leggibile ... (cioè che [read (2)] (http://man7.org/linux/man-pages/man2/read.2.html) non bloccherà). –

risposta

6

Si potrebbe voler provare la funzione select() e attendere l'immissione di dati nel flusso di input.

Descrizione:

select() e pselect() permettono un programma per monitorare più file descrittori, in attesa fino a quando uno o più dei descrittori di file diventerà "pronto" per un po 'di classe di operazioni I/O (ad es., input possibile). Un descrittore di file è considerato pronto se è possibile eseguire l'operazione di I/O corrispondente (ad esempio, lettura (2)) senza bloccare.

Nel tuo caso, il descrittore di file sarà stdin

void yourFunction(){ 
    fd_set fds; 
    struct timeval timeout; 
    int selectRetVal; 

    /* Set time limit you want to WAIT for the fdescriptor to have data, 
     or not(you can set it to ZERO if you want) */ 
    timeout.tv_sec = 0; 
    timeout.tv_usec = 1; 

    /* Create a descriptor set containing our remote socket 
     (the one that connects with the remote troll at the client side). */ 
    FD_ZERO(&fds); 
    FD_SET(stdin, &fds); 

    selectRetVal = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout); 

    if (selectRetVal == -1) { 
     /* error occurred in select(), */ 
     printf("select failed()\n"); 
    } else if (selectRetVal == 0) { 
     printf("Timeout occurred!!! No data to fetch().\n"); 
     //do some other stuff 
    } else { 
     /* The descriptor has data, fetch it. */ 
     if (FD_ISSET(stdin, &fds)) { 
      //do whatever you want with the data 
     } 
    } 
} 

Speranza che aiuta.

+3

Grazie per un istante, tuttavia, non voglio aspettare che il flusso di input abbia i dati, E 'solo che, se il flusso ha dati, ho bisogno di fare un po' di elaborazione, se non ha dati, fare qualche altra elaborazione. Il codice non dovrebbe attendere l'input, – 51k

+0

Continuo a pensare che questo possa aiutare @ 51k, lasciatemi fare un esempio. –

4

Cacho era sulla strada giusta, però select è necessaria solo se hai a che fare con più di un descrittore di file, e stdin non è un descrittore di file POSIX (int); È un FILE *. Vorresti usare STDIN_FILENO, se segui questa strada.

Non è un percorso molto pulito da prendere. Preferirei usare poll. Specificando 0 come timeout, il sondaggio verrà restituito immediatamente.

Se nessuno degli eventi definiti sono verificati su qualsiasi file selezionato descrittore, poll() deve attendere millisecondi almeno timeout per un evento si verifichi su uno qualsiasi dei descrittori di file selezionati. Se il valore di timeout è 0, poll() restituirà immediatamente. Se il valore del timeout è -1, poll() deve bloccare fino a quando si verifica un evento richiesto o fino a quando la chiamata viene interrotta.

struct pollfd stdin_poll = { .fd = STDIN_FILENO 
          , .events = POLLIN | POLLRDBAND | POLLRDNORM | POLLPRI }; 
if (poll(&stdin_poll, 1, 0) == 1) { 
    /* Data waiting on stdin. Process it. */ 
} 
/* Do other processing. */