Avant la normalisation, il a été ioctl(
...FIONBIO
...)
et fcntl(
...O_NDELAY
...)
, mais ils se sont comportés de façon incohérente entre les systèmes, et même au sein du même système. Par exemple, il était commun pour FIONBIO
de travail sur les prises et O_NDELAY
de travail sur les téléscripteurs, avec beaucoup d'incohérence pour des choses comme des tuyaux, fifo, et les périphériques. Et si vous ne savez pas quel type de descripteur de fichier que vous avez eu, vous auriez à régler à la fois pour être sûr. Mais, en outre, un non-bloquant lire avec pas de données disponibles a également été indiqué de façon incohérente; selon le système d'exploitation et le type de descripteur de fichier, la lecture peut retourner 0, ou -1 avec errno EAGAIN, ou -1 avec errno EWOULDBLOCK. Même aujourd'hui, l'implantation FIONBIO
ou O_NDELAY
sur Solaris provoque une lecture avec pas de données permettant de retourner la valeur 0 sur un ats ou un tuyau, ou -1 avec errno EAGAIN sur un socket. Cependant 0 est ambiguë, car il est également retourné pour les expressions du FOLKLORE.
POSIX abordé ce avec l'introduction de l' O_NONBLOCK
, qui a normalisé comportement à travers les différents systèmes et types de descripteur de fichier. Parce que les systèmes existants voulez généralement à éviter tout changement de comportement qui pourrait casser la compatibilité ascendante, POSIX a défini un nouveau drapeau, plutôt que de rendre obligatoire le comportement spécifique de l'un des autres. Certains systèmes comme Linux traiter tous les 3 la même, et aussi définir EAGAIN et EWOULDBLOCK à la même valeur, mais des systèmes qui souhaitent conserver une certaine autre comportement hérité pour la compatibilité descendante pouvez le faire lorsque les plus âgés sont les mécanismes utilisés.
Les nouveaux programmes devraient utiliser fcntl(
...O_NONBLOCK
...)
, normalisé par la norme POSIX.