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
Odpowiedz
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.
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
Wciąż myślę, że to mogłoby pomóc @ 51k, pozwól mi podać przykład. –
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. */
- 1. Sprawdź, czy obiekt jest pusty
- 2. Sprawdź, czy plik jest pusty
- 3. Sprawdź, czy NSDictionary jest pusty
- 4. Sprawdź, czy NSMutableDictionary jest pusty?
- 5. Czy plik jest pusty sprawdź
- 6. Sprawdź, czy katalog jest pusty
- 7. Sprawdź, czy NumericUpDown jest pusty
- 8. Jquery Sprawdź, czy akapit jest pusty
- 9. Sprawdź, czy atrybut CoreData jest pusty.
- 10. AS3: Sprawdź, czy słownik jest pusty.
- 11. Django CMS - sprawdź czy zastępczy jest pusty
- 12. Sprawdź, czy plik wejściowy jest pusty jquery
- 13. Sprawdź, czy img src jest pusty jQuery
- 14. Sprawdź, czy ResultSet jest pusty w Javie
- 15. Sprawdź, czy numer NSN jest pusty
- 16. Sprawdź, czy określony plik wejściowy jest pusty
- 17. Sprawdź, czy reagują elementem jest pusty
- 18. Python - Sprawdź, czy plik jest pusty, czy nie.
- 19. Java - Sprawdź, czy JTextField jest pusty czy nie
- 20. Sprawdź, czy NSDate posiada datę lub jest pusty
- 21. Sprawdź, czy pole wejściowe jest pusty na polach z jQuery
- 22. Sprawdź, czy obiekt jest pusty z JavaScript/jQuery
- 23. Sprawdź, czy parametr jest pusty lub pusta w procedurze przechowywanej.
- 24. ruby-on-rails sprawdź, czy wynik zapytania jest pusty (Model.find)
- 25. laravel 4,2 ostrze: sprawdź czy pusty
- 26. Sprawdź, czy nie jest zerowy i czy nie jest pusty w skrócie Rails?
- 27. Czy close/fclose na stdin jest poprawne?
- 28. Sprawdź, czy jest fałsz.
- 29. Ruby sprawdź czy blok jest zerowy
- 30. wykryć, czy obiekt jest pusty
C++ lub C? Twoje pytanie jest oznaczone dwoma. –
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ć). –