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.
Seperti yang dikatakan @Sean,
fcntl()
sebagian besar terstandarisasi, dan oleh karena itu tersedia di seluruh platform. Ituioctl()
Fungsi mendahuluifcntl()
di Unix, tetapi tidak standar sama sekali. Untunglahioctl()
bekerja untuk Anda di semua platform yang relevan dengan Anda, tetapi tidak dijamin. Secara khusus, nama yang digunakan untuk argumen kedua bersifat rahasia dan tidak dapat diandalkan di seluruh platform. Memang, mereka sering kali unik untuk driver perangkat tertentu yang dirujuk oleh deskriptor file. (ioctl()
Panggilan yang digunakan untuk perangkat grafis yang dipetakan bit yang berjalan pada ICL Perq yang menjalankan PNX (Perq Unix) dua puluh tahun yang lalu tidak pernah diterjemahkan ke hal lain di mana pun, misalnya.)sumber
Saya percaya itu
fcntl()
adalah fungsi POSIX. Sedangkanioctl()
adalah hal UNIX standar. Berikut adalah daftar POSIX io .ioctl()
adalah hal yang sangat spesifik untuk kernel / driver / OS, tetapi saya yakin apa yang Anda gunakan berfungsi pada sebagian besar varian Unix. beberapaioctl()
hal lain mungkin hanya bekerja pada OS tertentu atau bahkan revs tertentu dari kernelnya.sumber