До стандартизації існували ioctl(
... FIONBIO
... )
і fcntl(
... O_NDELAY
... )
, але вони поводились непослідовно між системами і навіть в рамках однієї системи. Наприклад, це було загальним для FIONBIO
роботи на розетках і O_NDELAY
роботи на ttys, з великою кількістю невідповідностей для таких речей, як труби, фіфо та пристрої. І якщо ви не знаєте, який у вас дескриптор файлу, вам доведеться встановити обидва, щоб бути впевненим. Але крім того, неблокуюче зчитування без наявних даних також вказувалося непослідовно; залежно від ОС та типу дескриптора файлу, прочитане може повернути 0, або -1 з errno EAGAIN, або -1 з errno EWOULDBLOCK. Навіть сьогодні установка FIONBIO
абоO_NDELAY
на Solaris змушує читання без даних повертати 0 на tty або трубі, або -1 з errno EAGAIN на сокеті. Однак 0 є неоднозначним, оскільки воно також повертається для EOF.
POSIX вирішив це питання введенням O_NONBLOCK
, який стандартизував поведінку в різних системах та типах дескрипторів файлів. Оскільки існуючі системи зазвичай хочуть уникнути будь-яких змін у поведінці, які можуть порушити зворотну сумісність, POSIX визначив новий прапор, а не зобов’язував конкретну поведінку для однієї з інших. Деякі системи, такі як Linux, відносяться до всіх трьох однаково, а також визначають EAGAIN та EWOULDBLOCK до одного і того ж значення, але системи, які бажають підтримувати деякі інші застарілі дії для зворотної сумісності, можуть це робити, коли використовуються старіші механізми.
Нові програми повинні використовувати fcntl(
... O_NONBLOCK
... )
, як стандартизовано POSIX.