Linux下C編程:signal和sigaction

來源:互聯網
上載者:User

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

1、註冊訊號函數。

#include<signal.h>              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樣本如下:

#include <stdio.h>#include <sys/types.h>#include <stdlib.h>#include <signal.h>void func(int sig){printf("I get asignal!\n");}int main(){    charbuffer[100];   if(signal(SIGINT, func) == SIG_ERR)     {     printf("signalerror exit now\n");     exit(0);     }     printf("pid:%ld\n",(long)getpid());   for(;;)      {     fgets(buffer,sizeof(buffer),stdin);     printf("bufferis:%s\n",buffer);     } return 0;      }

通常情況下一個使用者進程需要處理多個訊號。可以在一個程式中註冊多個訊號處理函數。一個訊號可以對應一個處理函數,同時多個訊號可以對應一個處理函數。

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

2、 進階訊號處理。

在linux系統提供了一個功能更強的系統調用。

#include <signal.h>              int sigaction(int signumbet,const structsigaction *act,struct sigaction *oldact)

此函數除能註冊訊號函數外還提供了更加詳細的資訊,確切瞭解進程接收到訊號,發生的具體細節。

struct sigaction的定義如下:在linux2.6.39/include/asm-generic/signal.h中實現

struct sigaction     {      void(*sa_handler)(int);     void(*sa_sigaction)(int,siginfo_t *,void *);     sigset_tsa_mask;     intsa_flags;}

siginfo_t在linux2.6.39/include/asm-generic/siginfo.h中實現:

sa_flags的取值如下表,取0表示選用所有預設選項。

SA_NOCLDSTOP:用於表示訊號SIGCHLD,當子進程被中斷時,不產生此訊號,若且唯若子進程結束時產生此訊號。

SA_NOCLDWATI:當訊號為SIGCHLD,時可避免子進程僵死。

SA_NODEFER:當訊號處理函數進行中時,不堵塞對於訊號處理函數自身訊號功能。

SA_NOMASK:同SA_NODEFER

SA_ONESHOT:當使用者註冊的訊號處理函數被執行過一次後,該訊號的處理函數被設為系統預設的處理函數。

SA_RESETHAND:同SA_ONESHOT

SA_RESTART:是本來不能重新於啟動並執行系統調用自動重新運行。

SA_SIGINFO:表明訊號處理函數是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它將顯示更多的訊號處理函數資訊。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。