2017-04-14 29 views
0

嗨,我已經完成了這個代碼,但有些東西需要添加。如何安裝信號處理程序名稱sig_handler

  1. 忽略信號SIGINT
  2. 爲SIGINT信號處理程序恢復到默認一個
  3. 捕獲信號SIGINT和打印出信號的數值

到目前爲止是這樣的編碼我有

 void sig_handler(int signo) 
    { 
    // body of signal handler 
    } 

    int main() 
{ 
    struct sigaction act; 
    act.sa_flags = 0; 
    act.sa_handler = sig_handler; 
    sigfillset(& (act.sa_mask)); 

if (sigaction(sig, &act, NULL) != 0) 
    { 
     perror("sigaction"); exit(1); 
    } 
} 
+0

問題是? – alk

+0

你想編寫一個捕獲SIGINT並打印其數值的代碼嗎?你想做更多的事嗎? 請參考[this](http://stackoverflow.com/questions/4217037/catch-ctrl-c-in-c)瞭解如何編寫代碼的提示。 – Gaurav

回答

0

這樣的事情會讓你開始。

#include <stdio.h> 
#include <signal.h> 

void handle_signal(int signum) 
{ 
    printf("\nRecived signal: %d\n", signum); 
    switch(signum) 
    { 
     case SIGINT: 
      printf("I won't respond to ctrl-c!\n"); 

      //restore to default 
      signal(SIGINT, SIG_DFL); 
      break; 
     case SIGWINCH: 
      //windows size change 
      break; 
     case SIGCONT: 
      //continue process 'fg' in terminal 
      break; 
     case SIGTSTP: 
      //ctrl-z 
      break; 
     default: 
      //others 
      break; 
    } 
} 

void  listen_to_signals(void) 
{ 
    int  i; 

    i = 0; 
    while (i < 32) 
    { 
     if (i != SIGKILL && i != SIGSTOP && i != SIGCHLD && i != SIGCONT && 
      i != SIGURG && i != SIGIO) 
      signal(i, &handle_signal); 
     i++; 
    } 
} 

int  main() 
{ 
    listen_to_signals(); 
    while(1) 
    {} 
} 

請注意,我正在監聽所有可能的信號:有一些信號我無法聽到(如殺死)。

注:使用「殺-9 pidof your_program」來阻止它

注:第一次SIGINT將被忽略,但第二次,它不會(因爲我使其恢復到它的默認行爲)