2010-12-22 15 views
6

Bir işletim sistemi kursu için bir program izleyicisi yazıyorum (bir giriş gibi çok temel olsa da).Bir programın çalıştırılmasını bir sinyal ile sonlandırıp sonlandırılmadığını nasıl anlarsınız?

Monitörün yapması gereken şeylerden biri, "doğal nedenler" ile bittiğinde izlediği programın sonlandırma kodunu veya sonlandırılmasından sorumlu sinyalin kodunu göstermektir.

Şu anda sadece çocuğumun infazını bitirmesini ve ardından fesih kodunu yakalamasını bekliyorum.

pid_t id = -1; 
switch (id = fork()) { 
    // Error when forking: 
    case -1: 
     error(-1, "Something went wrong when forking."); 
     exit(-1); 
    // Code for the child process: 
    case 0: 
     // Just launch the program we're asked to: 
     execvp(argv[2], &argv[2]); 
     // If reached here it wasn't possible to launch the process: 
     error(1, "Process could not be launched."); 
     exit(1); 
    // Code for the parent process: 
    default: 
     // Just wait for the child to finish its execution: 
     wait(&return_value); 
} 

error(2) bir hata ortaya çıktığında sadece kod basitleştirmek için, bir kaydedici fonksiyonudur: Bu, ilgili kod parçacığı olduğunu.

Ben süreç farklı ifadeleri göstermek için nasıl bağlı: X, sonlandırma kodu veya sinyal alınan olurdu

Process ended: X 

veya

Process terminated with signal X. 

. Çocuk sürecinin bir sinyal nedeniyle sona erdiğini nasıl bilebilirdik? wait(2) itibaren

cevap

5

:

WIFSIGNALED(status) 
      returns true if the child process was terminated by a signal. 
    WTERMSIG(status) 
      returns the number of the signal that caused the child process to terminate. 

Yani WIFSIGNALED(return_value) kontrol etmeniz gerekir ve eğer doğruysa, WTERMSIG(return_value) kontrol edin.

+0

Teşekkür ederiz! El kitabında bulmalıydım ... Bunun için üzgünüm. – Johannes

İlgili konular