2016-03-26 21 views
0

SIGINT (CTRL + C) yakalamaya çalışıyorum. Kullanıcı CTRL + C yazarken, çocuk işlemini öldüreceğini, ancak baba sürecinin normal şekilde devam etmesini istiyorum. Programımda alt işlemim olduğunda, iyi çalışıyor, ancak alt işlem yapmadığımda "segmentasyon hatası" alıyorum.segmentasyon hatası sinyal işleyicisi sigint

Bunu yapmış:

void sig_handler(int signo); 
//======================================== 
int main() 
{ 
    // CTRL + C => SIGINT handler 
    struct sigaction act; 
    act.sa_handler = sig_handler; 
    sigfillset(&act.sa_mask); 
    act.sa_flags = 0; 

    // Catch the signal 
    sigaction(SIGINT, &act, NULL); 
... 
// done some checks and then fork a child. 
} 

// SIGINT handler 
void sig_handler(int signo) 
{ 
// dont know what to write here 
} 
+0

Çocuğunuzun işleyişini iptal etmeden önce mevcut işlem kimliğini alın, sonra çocuğunuzu çatallayın ve işlem kimliğini alın, sonra ctrl c'nin ana işlem kimliği için olup olmadığını kontrol edin veya mantığınızı ona göre uygulamayın. – FZE

+0

Segmentasyon hatasıyla hangi kod satırındasınız? –

cevap

0

Sadece sigset kullanarak() size hedefe ulaşmak inanıyoruz.

Ben sigset'in man sayfasından bazı bilgiler veririm.

sigset() işlevi, sinyal dağıtmalarını değiştirir. nolu sig argümanı, SIGKILL ve SIGSTOP hariç herhangi bir sinyal olabilen sinyali belirtir. Değişken argümanı, sinyalin, SIG_DFL, SIG_IGN veya bir sinyal işleyicisinin adresi olabilecek eğilimini belirtir. Sigset(), kullanılırsa ve disp, bir sinyal işleyicisinin adresiyse, sistem, işleyicisinin sinyalini yürütmeden önce çağrı işleminin sinyal maskesini işaretine ekler; Sinyal işleyici geri döndüğünde, sistem, sinyalinin iletilmesinden önce çağrı işleminin sinyalinin durumunu geri yükler. Ayrıca, sigset() kullanılır ve disp SIG_HOLD'e eşit ise, çağrı işleminin sinyal maskesine sig eklenir ve sig'ın düzeni değişmeden kalır. Sigset() kullanılır ve disp Sipp_HOLD'ye eşit değilse, çağrı işleminin sinyal maskesinden sig kaldırılır. sighold, sigignore, sigpause, sigrelse, sigset — legacy interface for signal management

Sen SIGINT olsun çağrılır bir işleyici işlevi kurabilir:

bu bağlantıyı bakın.

void handler(int signo){ 
    // Here you can kill the child, if it exists 
} 

int main(int argc, char *argv[]) 
{ 
    ... 
    sigset(SIGINT, handler); 
    ... 
} 

Daha fazla yardıma gereksinim duyarsanız, yorumlarda belirtmeniz yeterlidir.

+0

Cevabınız probleminizi çözerse lütfen çekin. --Teşekkürler – shahharshil46

İlgili konular