歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

一步一步學Linux C:signal 和sigaction

要對一個信號進行處理,就需要給出此信號發生時系統所調用的處理函數。可以對一個特定的信號(除去SIGKILL和SIGSTOP信號)注冊相應的處理函數。注冊某個信號的處理函數後,當進程接收到此信號時,無論進程處於何種狀態,就會停下當前的任務去執行此信號的處理函數。

1、注冊信號函數。

  1. #include<signal.h>
  2. void(*signal(int signumber,void ((*func)(int))(int)  

signumber表示信號處理函數對應的信號。func是一個函數指針。此函數有一整型參數,並返回void型。其實func還可以取其他定值如:SIG_IGN,SIG_DFL.

SIG_IGN表示:忽略signumber所指出的信號。SIG_DFL表示表示調用系統默認的處理函數。signal函數的返回值類型同參數func,是一個指向某個返回值為空並帶有一個整型參數的函數指針。其正確返回值應為上次該信號的處理函數。錯誤返回SIG_ERR

signal示例如下:

  1. #include <stdio.h>   
  2.   
  3. #include <sys/types.h>   
  4.   
  5. #include <stdlib.h>    
  6.   
  7. #include <signal.h>    
  8.   
  9. void func(int sig)   
  10. {  
  11. printf("I get asignal!\n");  
  12. }   
  13. int main()   
  14. {    charbuffer[100];   
  15.   
  16.    if(signal(SIGINT, func) == SIG_ERR)  
  17.      {  
  18.      printf("signalerror exit now\n");  
  19.      exit(0);  
  20.      }  
  21.      printf("pid:%ld\n",(long)getpid());  
  22.   
  23.    for(;;)  
  24.   
  25.      {  
  26.   
  27.      fgets(buffer,sizeof(buffer),stdin);  
  28.   
  29.      printf("bufferis:%s\n",buffer);  
  30.   
  31.      }  
  32.  return 0;   
  33. }   

通常情況下一個用戶進程需要處理多個信號。可以在一個程序中注冊多個信號處理函數。一個信號可以對應一個處理函數,同時多個信號可以對應一個處理函數。

對於SIGINT信號 我們可以用ctrl+c或ctrl+z來中斷進程,來執行SIGINT注冊的函數。

Copyright © Linux教程網 All Rights Reserved