EnderUNIX Team.


EnderUNIX İpucu

Arkadaşıma gönder , Ana Sayfa

[ C/C++ ]

"parent'taki close ne zaman soketi kapatir" - Barış Şimşek - (2005-04-15 15:23:57)   [3017]

bir socket accept edildi ve fork edildi.


new_socket = accept();
child = fork();
if(child < 0)
  hata
else if(child == 0) {
   child in isleri
   send();
   recv();
   close(new_socket);
}
else {
   parent;
   close(new_socket);
}


bu kodda eger shutdown kullanacak olsaydik child henuz send islemini yapmadan parent shutdown yapacak ve dolaysiyla send yapilamayacakti. cunku parent ile child surec, schedular tarafindan calismaya alinir. teorik olarak paralel calisirlar. eger child islerini bitmeden ana surecteki shutdown a varilirsa child in isleri yarim kalacak.

bu senkronizasyon problemini close() kullanarak cozuyoruz. close() bu sokete olan referans sayisi 0 olmadikca soketi kapatmaz. dolaysiyla ana surecte close() a ulassa bile kod, child hala soketi kullandigindan referans sayisi 1 olacak. ana surec referans sayisi 0 olmadigindan soketi kapatmayacak. ne zaman child soketi kapatir, o zaman kernel tarafindan soket tamamen silinir.

fork edildiginde sokete olan referans sayisi 2 dir. bir parent referansi vardir, bir de child. her close ile referanslar kapatilir ve referans sayisi bir azaltilir. ancak shutdown tamamen soket operasyonlari icindir. referans sayisina bakmaz. teorik olarak close ve shutdown ayni isi yapsa da kernel implementasyonu acisindan yukarda bahsettigim fark vardir.

close() kodu bloklamaz. yani referans sayisi 0 olana kadar beklemez. kernel close() cagrisini alir ve kodu devam ettirir. kernel kendisi close çağrısını hafızasında tutarak, referans sayısı 0 olduğunda close() u işletir.

Bu inceliğin ortaya çıkmasında yardımcı olan Murat Balaban'a teşekkürler.



Arkadaşıma gönder , Ana Sayfa