Comment faire pour voir si un tube est vide

En supposant une pipe,

int pipe_fd[2];
pipe(pipe_fd);

Nous fourche, et s'attendre à ce que l'un processus d'écriture dans le tube à un moment arbitraire. Dans l'un des processus, nous voulons être en mesure de vérifier le contenu de la pipe sans blocage.

c'est à dire Tandis qu'une lecture de bloc si rien n'est présent et à l'écriture, à la fin reste ouverte. Je veux aller faire d'autres choses et peut-être même de lire un peu à la fois, faire quelques trucs, puis vérifier à nouveau pour voir si il n'y a plus, à la:

close(pipe_fd[1]);

while(1){
    if(/**Check pipe contents**/){
        int present_chars = 0;    

        while( read(pipe_fd[0],&buffer[present_chars],1) != 0)
            ++present_chars;

        //do something

    }
    else
        //do something else
}
Depuis le pipe() fonction ne vous permet pas de jeu non-blocage de la mode, vous avez à faire après la pipe est créé avec fcntl() et F_GETFL et F_SETFL plus O_NONBLOCK.
Notez que Linux a aussi le pipe2 fonction, ce qui vous permet de demander la non bloquante en mode dans le même temps, le tube est créé. Cette fonction n'est pas encore la norme, mais il a été accepté d'inclure dans la prochaine version de POSIX depuis il est également nécessaire pour atomiquement réglage du close-on-exec drapeau dans le même temps, le tube est créé.

OriginalL'auteur darkpbj | 2012-12-11