SORU
19 Temmuz 2009, Pazar


UNIX G/Ç yapmayan: O_NONBLOCK vs FIONBIO

Her örnek ve tartışma rastlamak bağlamında BSD soket programlama, görünen o ki, tavsiye için bir dosya tanımlayıcısı yapmayan G/Ç modu kullanarak bayrak fcntl(), örn

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);

On yılı aşkın süredir UNIX ağ programlama yapıyorum ve her zaman FIONBIO ioctl() çağrı bunu yapmak için kullanmış:

int opt = 1;
ioctl(fd, FIONBIO, &opt);

Hiç neden verdi çok düşündüm. Ben öyle öğrendim.

Kimseye veya başka bir olası ilgili esas hakkındaki herhangi bir yorum var mı? Ben taşınabilirlik odağı biraz farklı, ama hayal ioctl_list(2) ölçüde ioctl bireysel yöntemler bu yönünü bilmeyen ne kadar bilmiyorum.

CEVAP
19 Temmuz 2009, Pazar


Önce standardizasyon vardı ioctl(...FIONBIO...) ve fcntl(...O_NDELAY...), ama bu tutarsız davrandığını sistemleri arasında ve hatta içinde aynı sistem. Örneğin, bunlarla çalışmak FIONBIO yuva üzerinde çalışmak için ortak ve O_NDELAY, borular, FIFO ' lar ve cihazlar gibi şeyler için bir sürü tutarsızlık vardı. Ve eğer ne olduğunu bilmiyordun bile, emin olmak için ikisini de ayarlamak gerekiyor. Ama ek olarak, engellenmeyen bir okuma ile hiçbir veri mevcut olduğunu da belirtti tutarsız; bağlı olarak işletim sistemi ve dosya türü tanımlayıcı okuyabilirsiniz return 0 veya -1 ile EAGAIN hata, ya da -1 ile hata durum olarak ele. Bugün bile, Solaris FIONBIO O_NDELAY ayar veri ile bir okuma bir yuvada hata EAGAIN ile tty veya bir boru veya -1 0 dönmek neden olur. Ancak 0 da EOF için iade olduğu belirsiz.

POSIX farklı sistemler ve tanımlayıcı dosyası türleri arasında standart bir davranış olan O_NONBLOCK giriş ile bu ele. Mevcut sistemler genellikle geriye uyumluluk bozabilecek davranış değişiklikleri önlemek istiyorum çünkü, POSIX diğerleri için belirli bir davranışı zorunlu kılan yerine yeni bir bayrak tanımlanmış. Bazı sistemleri gibi Linux tedavi 3 Aynı, ve aynı zamanda define EAGAIN ve durum olarak ele aynı değer, ama sistemleri korumak isteyen bazı diğer eski davranış, geriye doğru uyumluluk için bu nedenle zaman eski mekanizmaları kullanılır.

Yeni programları POSIX tarafından standart olarakfcntl(...O_NONBLOCK...), kullanmalısınız.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ibebrent

    ibebrent

    23 Temmuz 2007
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • Project Mooncircle

    Project Moon

    6 Aralık 2009