Sebelum standarisasi ada ioctl(
... FIONBIO
... )
dan fcntl(
... O_NDELAY
... )
, tapi ini berperilaku tidak konsisten antara sistem, dan bahkan dalam sistem yang sama. Misalnya, FIONBIO
bekerja pada soket dan O_NDELAY
tty merupakan hal yang umum , dengan banyak ketidakkonsistenan untuk hal-hal seperti pipa, fifos, dan perangkat. Dan jika Anda tidak tahu jenis deskriptor file yang Anda miliki, Anda harus menyetel keduanya untuk memastikan. Namun sebagai tambahan, pembacaan non-pemblokiran tanpa data tersedia juga diindikasikan secara tidak konsisten; tergantung pada OS dan jenis deskriptor file, pembacaan dapat mengembalikan 0, atau -1 dengan errno EAGAIN, atau -1 dengan errno EWOULDBLOCK. Bahkan hari ini, pengaturan FIONBIO
atauO_NDELAY
pada Solaris menyebabkan pembacaan tanpa data mengembalikan 0 pada tty atau pipa, atau -1 dengan errno EAGAIN pada soket. Namun 0 adalah ambigu karena juga dikembalikan untuk EOF.
POSIX membahas ini dengan pengenalan O_NONBLOCK
, yang memiliki perilaku standar di berbagai sistem dan jenis deskriptor file. Karena sistem yang ada biasanya ingin menghindari perubahan apa pun pada perilaku yang mungkin merusak kompatibilitas ke belakang, POSIX mendefinisikan sebuah flag baru daripada mengamanatkan perilaku tertentu untuk salah satu dari yang lain. Beberapa sistem seperti Linux memperlakukan ketiganya dengan sama, dan juga mendefinisikan EAGAIN dan EWOULDBLOCK ke nilai yang sama, tetapi sistem yang ingin mempertahankan beberapa perilaku lama lainnya untuk kompatibilitas ke belakang dapat melakukannya ketika mekanisme yang lebih lama digunakan.
Program baru harus menggunakan fcntl(
... O_NONBLOCK
... )
, seperti yang distandarisasi oleh POSIX.