biliniyor ki çatal() Sistem çağrısı, arayan sürecin çocuğu olan yeni bir süreç oluşturmak için kullanılır.
Çıkış sonrasında çocuk, ebeveyne iade edilmesi gereken bir çıkış durumu bırakır. Yani çocuk bitirdiğinde bir hale gelir zombi .
Çocuk her çıktığında veya durduğunda ebeveyne bir mesaj gönderilir. SIGCHLD sinyal.
Ebeveyn, durdurulan çocuğun durumu hakkında bilgi edinmek için wait() veya waitpid() sistem çağrısını WIFEXITED ve WEXITSTATUS makrolarıyla birlikte kullanabilir.
(*)wait() sistem çağrısı : Çocuklarından biri sonlandırılana kadar çağrı işleminin yürütülmesini askıya alır.
wait() sistem çağrısının sözdizimi:
pid_t wait(int *status);
(*)Waitpid() sistem çağrısı: pid argümanı tarafından belirtilen bir alt durum değişene kadar çağrı işleminin yürütülmesini askıya alır.
waitpid() sistem çağrısının sözdizimi:
pid_t waitpid(pid_t pid int *status int options)
Not: Varsayılan olarak waitpid() yalnızca sonlandırılan çocukları bekler ancak bu davranış WIFEXITED WEXITSTATUS vb. gibi seçenekler argümanı aracılığıyla değiştirilebilir.
Pid değeri şu şekilde olabilir:
- -1'den küçük: Süreç grubu kimliği pid'in mutlak değerine eşit olan herhangi bir alt işlemin beklenmesi anlamına gelir.
- -1'e eşittir: Herhangi bir alt işlemin beklenmesi anlamına gelir.
- Eşittir 0 : Süreç grubu kimliği çağıran sürecinkine eşit olan herhangi bir alt sürecin beklenmesi anlamına gelir.
- 0'dan büyük: İşlem kimliği pid değerine eşit olan çocuğun beklenmesi anlamına gelir.
WIFEXITED ve WEXITSTATUS çocuğun çıkış durumunu bilmek için kullanılabilecek seçeneklerden ikisidir.
WIFEXITED(status) : çocuk normal şekilde sonlandırılırsa true değerini döndürür.
WEXITSTATUS(status) : Çocuğun çıkış durumunu döndürür. Bu makro yalnızca WIFEXITED true değerini döndürdüğünde kullanılmalıdır.
Aşağıda çocuğun kullandığı bir C uygulaması bulunmaktadır. excl() işlevi var ancak execl() için belirtilen yol tanımsız.
Ebeveynin aldığı çocuğun çıkış durumu değerinin ne olduğunu görelim.
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
Çıkış:

Not : fork() devre dışı olduğundan yukarıdaki kod çevrimiçi derleyiciyle çalışmayabilir.
Burada çıkış durumu 127'dir, bu da yolda bir sorun olduğunu veya bir yazım hatası olduğunu gösterir.
Ekstra bilgi için aşağıda birkaç çıkış durumu kodu listelenmiştir:
- 1 : 'Sıfıra bölme' gibi çeşitli hatalar ve diğer izin verilmeyen işlemler.
-
2 : Eksik anahtar kelime veya komut veya izin sorunu. - 126: İzin sorunu veya komut çalıştırılabilir değil
- 128 : çıkmak için geçersiz argüman.
Not: C standardı dönüş kodlarının anlamını tanımlamaz. İade kodlarının kullanımına ilişkin kurallar farklı platformlarda değişiklik gösterir.