Question

D'après ce que je lis sur le site Open Group sur fcntl , open , read et

Était-ce utile?

La solution

O_NONBLOCK est une propriété de la description de fichier ouvert, pas du descripteur de fichier, ni du fichier sous-jacent.

Oui, vous pourriez avoir des descripteurs de fichiers séparés ouverts pour le même fichier, l'un qui bloque et dont l'autre est non-bloquant.

Vous devez faire la distinction entre un FIFO (créé à l'aide mkfifo() ) et un tuyau (créée en utilisant pipe() ).

Notez que l'état de blocage est une propriété de la « description de fichier ouvert », mais dans les cas les plus simples, il y a une correspondance biunivoque entre les descripteurs de fichiers et les descriptions de fichiers ouverts. L'appel de fonction open() crée une nouvelle description de fichier ouvert et un nouveau descripteur de fichier qui fait référence à la description de fichier ouvert.

Lorsque vous utilisez dup() , vous avez deux descripteurs de fichiers partageant ouvrir la description de fichier et les propriétés appartiennent à la description de fichier ouvert. La description de fcntl() dit que F_SETFL affecte la description de fichier ouvert associé à la descripteur de fichier. Notez que lseek() ajuste la position du fichier de la description de fichier ouvert associé à la descripteur de fichier -. il affecte d'autres descripteurs de fichiers en double de l'original

Suppression de l'erreur de manipulation de votre code pour le réduire, vous avez:

int fds[2];
pipe(fds);
int fd0_dup = dup(fds[0]);
fcntl(fd0_dup, F_SETFL, fcntl(fd0_dup, F_GETFL) | O_NONBLOCK);

Maintenant, les deux fd0_dup et fds [0] se référer à la même description de fichier ouvert (à cause du dup()), l'opération de fcntl() affecté les deux descripteurs de fichiers.

if ((fcntl(fds[0], F_GETFL) & O_NONBLOCK)) { ... }

D'où le comportement observé est ici requise par Posix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top