EnderUNIX Team.


EnderUNIX İpucu

Arkadaşıma gönder , Ana Sayfa

[ C/C++ ]

"exit, _exit, süreçleri sonlandırma" - Barış Şimşek - (2005-01-14 11:38:04)   [4038]

Kullanıcıların başlattığı bütün süreçler, kabuk tarafından fork() edilerek oluşturulan alt süreçlerdir. Ancak bunların ana süreci kabuk(shell) değil /sbin/init'tir. Yani Parent PID'leri 1'dir. Kullanıcı süreçleri de fork() ile kendi alt süreçlerini oluşturabilir.

Süreçler, exit() fonksiyonu veya _exit() sistem çağrısı ile sonlandırılır. Sonlanan süreç exit(return_code) veya _exit(status) şeklinde kendini oluşturan ana sürece çıkış değeri döner. Bir programın main() fonksiyonu içerisinde "return" kullanılarak da program sonlandırılabilir. Main dışındaki fonksiyonlarda return, yalnızca fonksiyondan çıkışı sağlar; programın sonlanmasına neden olmaz.

_exit() ile exit() arasındaki en temel fark, _exit() sistem çağrısıdır. exit() ise C library'sine ait bir fonksiyondur. Bu nedenle _exit() G/Ç işlemleri için flush yapmaz. exit() çıkmadan flush eder ve bütün stream'leri kapatır. (Hatırlayın, stdio library'si buffered'tır. Aynı şekilde sistem çağrısı write() ile libc fonksiyonu printf() arasında aynı fark vardır. write buffer'lanmadan doğrudan standart çıktıya yazılır. Printf ise buffer'lanır ve \n görüğünde flash edilir.)

child prosesden exit() ile çıkılırsa, exit() bütün buffer'ları flush edecek ve bütün standart G/Ç(I/O) işlemlerini kapatacak. Alt süreç dosya tanımlayıcıları ana süreçten aynen miras aldığı için onları da kapayacak. Dolaysıyla eğer bir alt süreç exit() ile çıkarsa, kendinden sonra ana süreç printf yapsa da ekrana birşey yazılmayacaktır.

_exit() ile çıkılırsa parent'in yapacağı printf ler gözükür. Çünkü _exit() stream'leri kapatmaz, flush etmez.

Bir programdan normal çıkış kodları exit() ile verilir. Ancak anormal sonlanma durumunda kullanıcı sonlanma nedenini tespit edemeyecek, ana süreç alt süreç hakkında bilgi sahibi olamayacaktır. Buna engel olmay için çekirdek anormal sonlanmalara müdahele ederek sonlanma ile ilgili bir durum oluşturur. Daha sonra wait veya waitpid ile bu durum ana prosesden öğrenilebilir.


Arkadaşıma gönder , Ana Sayfa