8 votes

Vérifier si stdin est vide

J'ai cherché mais je n'ai pas trouvé de réponse pertinente à cette question, je travaille sur une machine linux, je voulais vérifier si le flux d'entrée standard contient un caractère, sans supprimer les caractères du flux.

6voto

cacho Points 2397

Vous pouvez essayer sélectionner() et attendre d'avoir des données dans le flux d'entrée.

Description :

sélectionner() et pselect() permettent à un programme de surveiller plusieurs fichiers fichiers, en attendant qu'un ou plusieurs de ces descripteurs deviennent "prêts" pour une certaine classe d'opérations d'E/S (par exemple, entrée possible). Un descripteur fichier est considéré comme prêt s'il est possible d'effectuer l'opération d'E/S l'opération d'E/S correspondante (par exemple, read(2)) sans blocage.

Dans votre cas, le descripteur de fichier sera 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
        }
    }
}

J'espère que cela vous aidera.

5voto

Cacho était sur la bonne voie, cependant select n'est nécessaire que si vous avez affaire à plus d'un descripteur de fichier, et stdin n'est pas un descripteur de fichier POSIX ( int ) ; C'est un FILE * . Il faut utiliser STDIN_FILENO si vous choisissez cette voie.

Ce n'est pas non plus une route très propre à prendre. Je préfère utiliser poll . En spécifiant 0 comme timeout le sondage reviendra immédiatement.

Si aucun des événements définis ne s'est produit sur un fichier sélectionné sélectionné, poll() attendra au moins le délai d'attente de millisecondes pour qu'un événement se produise sur l'un des descripteurs de fichiers sélectionnés. Si la valeur de timeout est 0, poll() revient immédiatement. Si la valeur de timeout est -1, poll() se bloque jusqu'à ce qu'un événement demandé se produise ou jusqu'à ce que l'appel soit interrompu.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X