2013-04-26 17 views
7

Szukałem, ale nie dostałem odpowiedniej odpowiedzi na to pytanie, pracuję na maszynie Linux, chciałem sprawdzić, czy standardowy strumień wejściowy zawiera dowolny znak, bez usuwania znaków ze strumienia.Sprawdź, czy stdin jest pusty

+1

C++ lub C? Twoje pytanie jest oznaczone dwoma. –

+3

Nie jestem pewien, czy twoje pytanie ma dobrze zdefiniowane znaczenie. Wyobraź sobie, że * stdin * jest potokiem (z polecenia, które trwa wieki wypluć swój pierwszy znak na * stdout *). Możesz zadzwonić [poll (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) używając 'STDIN_FILENO' (tj. 0) jako deskryptora pliku. Następnie sprawdź, czy * stdin * jest czytelne ... (to znaczy, że [read (2)] (http://man7.org/linux/man-pages/man2/read.2.html) nie będzie blokować). –

Odpowiedz

6

Możesz spróbować funkcji select() i poczekać na dane do strumienia wejściowego.

Opis:

select() i pselect() pozwalają program do monitorowania wielu plików deskryptory, czekając aż jeden lub więcej deskryptorów stać "gotowy" do pewnej klasy operacji wejścia/wyjścia (np. możliwe wejście). Deskryptor pliku uznawany jest za gotowy, jeśli możliwe jest wykonanie odpowiedniej operacji wejścia/wyjścia (np. Odczyt (2)) bez blokowania.

w Twoim przypadku, to deskryptor pliku będzie 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 
     } 
    } 
} 

Nadzieję, że to pomaga.

+3

Dziękuję za natychmiastowe polecenie, jednak nie chcę czekać na dane wejściowe, aby dane te, Po prostu, jeśli strumień ma dane, muszę wykonać pewne przetwarzanie, jeśli nie ma danych, inne przetwarzanie. Kod nie powinien czekać na dane wejściowe, – 51k

+0

Wciąż myślę, że to mogłoby pomóc @ 51k, pozwól mi podać przykład. –

4

cacho był na właściwej ścieżce, jednak select jest konieczne tylko wtedy, gdy masz do czynienia z więcej niż jednego deskryptora pliku, a stdin nie jest deskryptor pliku POSIX (int); To jest FILE *. Jeśli wybierzesz tę trasę, chcesz użyć STDIN_FILENO.

Nie jest to również bardzo łatwa droga. Wolałbym używać poll. Podając 0 jako timeout, ankieta natychmiast powróci.

Jeśli żadna z określonych zdarzeń miało miejsce na dowolnie wybrany plik deskryptorze, poll() musi poczekać co najmniej do czasu oczekiwania milisekund zdarzenie wystąpić na którymkolwiek z wybranych deskryptorów. Jeśli wartość limitu czasu wynosi 0, poll() natychmiast powróci. Jeśli wartość limitu czasu wynosząca wynosi -1, poll() będzie blokować do wystąpienia żądanego zdarzenia lub aż do przerwania połączenia.

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. */