Bloklama
Önceki İleri Teknikler Sonraki
Bloklama
Bloklama. Bunu duymuş olmalısınız -- peki anlamı nedir? Kabaca söylemek gerekirse "blok" (block) sözcüğü "uyku" (sleep) için kullandığımız teknik bir terim. Bunu, yukarıdaki listener programını çalıştırdığınızda görmüş olmalısınız. Yani program çalışır ve orada öylece bir paketin gelmesini bekler. Olup biten şudur: Bu program recvfrom() işlevini çağırır, ortalıkta bir veri yoktur ve bu yüzden recvfrom() "bloklama" yapar (yani orada uyur) ta ki bir veri gelene kadar.
Pek çok işlev blok yapar, yani uyur. accept() bloklar. Tüm recv() işlevleri bloklar, yani bekler. Bunu yapabilmelerinin sebebi ise onlara bunu yapabilmeleri için izin verilmiş olmasıdır. Soket tanımlayıcısını ilk aşamada socket() ile yarattığınızda, işletim sistemi çekirdeği onu bloklayan olarak ayarlar. Eğer bir soketin bloklama yapabilmesini istemiyorsanız o zaman fcntl() işlevini çağırmanız gerekir:
#include <unistd.h>
#include <fcntl.h>
.
.
sockfd = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
.
. 
Bir soketi bloklamayan olarak ayarladığınızda o soketten bilgi alabilirsiniz. Eğer bloklamayan bir soketten bir şeyler okumaya kalkarsanız ve orada bir veri yoksa, bloklama yapmasına izin verilmediği için bir değer döndürecektir, bu değer -1 olacaktır ve errno değişkeni de EWOULDBLOCK değerini alacaktır.
Ancak genelde bu şekilde bilgi edinmeye çalışmak pek de iyi bir fikir değildir. Eğer programınızı sürekli soketten veri okumaya çalışır hale getirirseniz o zaman çok fazla işlemci zamanından çalarsınız. Okunmak üzere bir verinin gelip gelmediğini kontrol etmenin daha şık bir yöntemi vardır ve bu yöntem select() işlevini temel alır.
Önceki Üst Ana Başlık Sonraki
İleri Teknikler Başlangıç select() -- Eşzamanlı G/Ç Çoğullama
Bir Linux Kitaplığı Sayfası