Avant la normalisation, il y avait ioctl(
... FIONBIO
... )
et fcntl(
... O_NDELAY
... )
, mais ceux-ci se comportaient de manière incohérente entre les systèmes, et même au sein du même système. Par exemple, il était courant FIONBIO
de travailler sur des sockets et O_NDELAY
de travailler sur des ttys, avec beaucoup d'incohérences pour des choses comme les tuyaux, les fifos et les périphériques. Et si vous ne saviez pas quel type de descripteur de fichier vous aviez, vous devrez définir les deux pour être sûr. Mais en outre, une lecture non bloquante sans données disponibles était également indiquée de manière incohérente; selon le système d'exploitation et le type de descripteur de fichier, la lecture peut renvoyer 0, ou -1 avec errno EAGAIN, ou -1 avec errno EWOULDBLOCK. Même aujourd'hui, le réglage FIONBIO
ouO_NDELAY
sous Solaris, une lecture sans données renvoie 0 sur un tty ou un tube, ou -1 avec errno EAGAIN sur un socket. Cependant 0 est ambigu car il est également renvoyé pour EOF.
POSIX a résolu ce problème avec l'introduction de O_NONBLOCK
, qui a normalisé le comportement de différents systèmes et types de descripteurs de fichiers. Parce que les systèmes existants veulent généralement éviter tout changement de comportement qui pourrait briser la compatibilité descendante, POSIX a défini un nouvel indicateur plutôt que d'imposer un comportement spécifique pour l'un des autres. Certains systèmes comme Linux traitent les trois de la même manière et définissent également EAGAIN et EWOULDBLOCK à la même valeur, mais les systèmes souhaitant conserver un autre comportement hérité pour la compatibilité descendante peuvent le faire lorsque les mécanismes plus anciens sont utilisés.
Les nouveaux programmes devraient utiliser fcntl(
... O_NONBLOCK
... )
, tel que standardisé par POSIX.