Friday 28 December 2007

LINUX Programlamağa Giriş– Süreçler 5

Ali Rıza SARAL(1)


(1) Neil Matthew ve Richard Stones, Beginning Linux Programming ‘den faydalanarak derlenmiştir.


Bir Süreci Bekleyiş
çatal (fork) ile bir çocuk süreç başlattığımızda, çocuk hayatını kendi ellerine alır ve bağımsız olarak koşar. Bazan, bir çocuk sürecin ne zaman bittiğini bulmak isteriz. Örn., bundan önceki programda ebeveyn çocuktan önce biter ve çocuk devam ederken kirli bir çıktı alırız. Çocuk bitinceye kadar ebeveyn sürecini bekleyişini bekle (wait) ‘yi çağırarak düzenleyebiliriz.

#include
#include
pid_t wait(int *stat_loc);

bekle sistem çağrısı bir ebeveyn sürecin, çocuk süreci duruncaya kadar duraklayışına neden olur. Çağrı çocuk sürecin SüreçKimlikNo’sunu (PID) geri döndürür. Bu normalde sona ermiş olan bir çocuk süreçtir. Durum bilgisi (status information) ebeveyn sürece çocuk sürecin çıkış durumunu belirleyiş imkanı sağlar, yani, anagövde (main) tarafından döndürülen değer veya çıkışa (exit) iletilen değer.

Eğer stat_loc bir boş işaretedici (null pointer) değilse, durum bilgisi işaret ettiği yere yazılacaktır. Durum bilgisini sys/wait.h ‘da tanımlanan makroları kullanarak tercüme edebiliriz. Bunlar

Macro Definition
WIFEXITED(stat_val) Çocuk normal bittiyse sıfır değil.
WEXITSTATUS(stat_val) Eğer WIFEXITED sıfır değilse, bu çocuk çıkış kodunu döndürür. WIFSIGNALED(stat_val) Eğer çocuk bir yakalanmadı (uncaught) işareti ile sona erdiyse sıfır değil.
WTERMSIG(stat_val) Eğer WIFSIGNALED sıfır değilse, bu bir işaret sayısı döndürür.
WIFSTOPPED(stat_val) Sıfır değilse çocuk durdu.
WSTOPSIG(stat_val) Eğer WIFSTOPPED sıfır değilse, bu bir işaret sayısı döndürür.
Örnek:
Programı çocuk süreci bekleyip onun bitiş durumunu yoklayabilecek şekilde değiştirelim. Wait.c

#include
#include
#include
#include
int main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf(“fork program starting\n”);
pid = fork();
switch(pid)
{
case -1:
perror(“fork failed”);
exit(1);
case 0:
message = “This is the child”;
n = 5;
exit_code = 37;
break;
default:
message = “This is the parent”;
n = 3;
exit_code = 0;
break;
}
for(; n > 0; n--) {
puts(message);
sleep(1);
}
Programın bu kısmı çocuk sürecin bitişini bekler.
if (pid != 0) {
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf(“Child has finished: PID = %d\n”, child_pid);
if(WIFEXITED(stat_val))
printf(“Child exited with code %d\n”, WEXITSTATUS(stat_val));
else
printf(“Child terminated abnormally\n”);
}
exit(exit_code);
}
Bu programı çalıştrınca, ebeveynin çocuğu beklediğini görürüz. When we run this program, we see the

$ ./wait
fork program starting
This is the child
This is the parent
This is the parent
This is the child
This is the parent
This is the child
This is the child
This is the child
Child has finished: PID = 1582
Child exited with code 37
$