天天看點

Linux 信号signal處理函數

alarm(設定信号傳送鬧鐘)

相關函數 signal,sleep

表頭檔案 #include<unistd.h>

定義函數 unsigned int alarm(unsigned int seconds);

函數說明 alarm()用來設定信号SIGALRM在經過參數seconds指定的秒數後傳送給目前的程序。如果參數seconds 為0,則之前設定的鬧鐘會被取消,并将剩下的時間傳回。

傳回值傳回之前鬧鐘的剩餘秒數,如果之前未設鬧鐘則傳回0。

範例 #include<unistd.h>

#include<signal.h>

void handler() {

printf("hello\n");

}

main()

{

int i;

signal(SIGALRM,handler);

alarm(5);

for(i=1;i<7;i++){

printf("sleep %d ...\n",i);

sleep(1);

執行 sleep 1 ...

sleep 2 ...

sleep 3 ...

sleep 4 ...

sleep 5 ...

hello

sleep 6 ...

 

kill(傳送信号給指定的程序)

相關函數 raise,signal

表頭檔案 #include<sys/types.h>

定義函數 int kill(pid_t pid,int sig);

函數說明 kill()可以用來送參數sig指定的信号給參數pid指定的程序。參數pid有幾種情況:

pid>0 将信号傳給程序識别碼為pid 的程序。

pid=0 将信号傳給和目前程序相同程序組的所有程序

pid=-1 将信号廣播傳送給系統内所有的程序

pid<0 将信号傳給程序組識别碼為pid絕對值的所有程序

參數sig代表的信号編号可參考附錄D

傳回值 執行成功則傳回0,如果有錯誤則傳回-1。

錯誤代碼 EINVAL 參數sig 不合法

ESRCH 參數pid 所指定的程序或程序組不存在

EPERM 權限不夠無法傳送信号給指定程序

#include<sys/types.h>

#include<sys/wait.h>

pid_t pid;

int status;

if(!(pid= fork())){

printf("Hi I am child process!\n");

sleep(10);

return;

else{

printf("send signal to child process (%d) \n",pid);

kill(pid ,SIGABRT);

wait(&status);

if(WIFSIGNALED(status))

printf("chile process receive signal %d\n",WTERMSIG(status));

執行 sen signal to child process(3170)

Hi I am child process!

child process receive signal 6

pause(讓程序暫停直到信号出現)

相關函數 kill,signal,sleep

定義函數 int pause(void);

函數說明 pause()會令目前的程序暫停(進入睡眠狀态),直到被信号(signal)所中斷。

傳回值 隻傳回-1。

錯誤代碼 EINTR 有信号到達中斷了此函數。

sigaction(查詢或設定信号處理方式)

相關函數 signal,sigprocmask,sigpending,sigsuspend

表頭檔案 #include<signal.h>

定義函數 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函數說明 sigaction()會依參數signum指定的信号編号來設定該信号的處理函數。參數signum可以指定SIGKILL和SIGSTOP以外的所有信号。

如參數結構sigaction定義如下

struct sigaction

void (*sa_handler) (int);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer) (void);

sa_handler此參數和signal()的參數handler相同,代表新的信号處理函數,其他意義請參考signal()。

sa_mask 用來設定在處理該信号時暫時将sa_mask 指定的信号擱置。

sa_restorer 此參數沒有使用。

sa_flags 用來設定信号處理的其他相關操作,下列的數值可用。

OR 運算(|)組合

A_NOCLDSTOP : 如果參數signum為SIGCHLD,則當子程序暫停時并不會通知父程序

SA_ONESHOT/SA_RESETHAND:當調用新的信号處理函數前,将此信号處理方式改為系統預設的方式。

SA_RESTART:被信号中斷的系統調用會自行重新開機

SA_NOMASK/SA_NODEFER:在處理此信号未結束前不理會此信号的再次到來。

如果參數oldact不是NULL指針,則原來的信号處理方式會由此結構sigaction 傳回。

錯誤代碼 EINVAL 參數signum 不合法,或是企圖攔截SIGKILL/SIGSTOPSIGKILL信号

EFAULT 參數act,oldact指針位址無法存取。

EINTR 此調用被中斷

void show_handler(struct sigaction * act)

switch (act->sa_flags)

case SIG_DFL:printf("Default action\n");break;

case SIG_IGN:printf("Ignore the signal\n");break;

default: printf("0x%x\n",act->sa_handler);

struct sigaction act,oldact;

act.sa_handler = show_handler;

act.sa_flags = SA_ONESHOT|SA_NOMASK;

sigaction(SIGUSR1,&act,&oldact);

for(i=5;i<15;i++)

printf("sa_handler of signal %2d =".i);

sigaction(i,NULL,&oldact);

執行 sa_handler of signal 5 = Default action

sa_handler of signal 6= Default action

sa_handler of signal 7 = Default action

sa_handler of signal 8 = Default action

sa_handler of signal 9 = Default action

sa_handler of signal 10 = 0x8048400

sa_handler of signal 11 = Default action

sa_handler of signal 12 = Default action

sa_handler of signal 13 = Default action

sa_handler of signal 14 = Default action

sigaddset(增加一個信号至信号集)

相關函數 sigemptyset,sigfillset,sigdelset,sigismember

定義函數 int sigaddset(sigset_t *set,int signum);

函數說明 sigaddset()用來将參數signum 代表的信号加入至參數set 信号集裡。

傳回值執行成功則傳回0,如果有錯誤則傳回-1。

錯誤代碼 EFAULT 參數set指針位址無法存取

EINVAL 參數signum非合法的信号編号

sigdelset(從信号集裡删除一個信号)

相關函數 sigemptyset,sigfillset,sigaddset,sigismember

定義函數 int sigdelset(sigset_t * set,int signum);

函數說明 sigdelset()用來将參數signum代表的信号從參數set信号集裡删除。

sigemptyset(初始化信号集)

相關函數 sigaddset,sigfillset,sigdelset,sigismember

定義函數 int sigemptyset(sigset_t *set);

函數說明 sigemptyset()用來将參數set信号集初始化并清空。

sigfillset(将所有信号加入至信号集)

相關函數 sigempty,sigaddset,sigdelset,sigismember

定義函數 int sigfillset(sigset_t * set);

函數說明 sigfillset()用來将參數set信号集初始化,然後把所有的信号加入到此信号集裡。

附加說明 EFAULT 參數set指針位址無法存取

sigismember(測試某個信号是否已加入至信号集裡)

相關函數 sigemptyset,sigfillset,sigaddset,sigdelset

定義函數 int sigismember(const sigset_t *set,int signum);

函數說明 sigismember()用來測試參數signum 代表的信号是否已加入至參數set信号集裡。如果信号集裡已有該信号則傳回1,否則傳回0。

傳回值信号集已有該信号則傳回1,沒有則傳回0。如果有錯誤則傳回-1。

EINVAL 參數signum 非合法的信号編号

signal(設定信号處理方式)

相關函數 sigaction,kill,raise

定義函數 void (*signal(int signum,void(* handler)(int)))(int);

函數說明 signal()會依參數signum 指定的信号編号來設定該信号的處理函數。當指定的信号到達時就會跳轉到參數handler指定的函數執行。如果參數handler不是函數指針,則必須是下列兩個常數之一:

SIG_IGN 忽略參數signum指定的信号。

SIG_DFL 将參數signum 指定的信号重設為核心預設的信号處理方式。

關于信号的編号和說明,請參考附錄D

傳回值傳回先前的信号處理函數指針,如果有錯誤則傳回SIG_ERR(-1)。

附加說明在信号發生跳轉到自定的handler處理函數執行後,系統會自動将此處理函數換回原來系統預設的處理方式,如果要改變此操作請改用sigaction()。

範例 參考alarm()或raise()。

sigpending(查詢被擱置的信号)

相關函數 signal,sigaction,sigprocmask,sigsuspend

定義函數 int sigpending(sigset_t *set);

函數說明 sigpending()會将被擱置的信号集合由參數set指針傳回。

傳回值執 行成功則傳回0,如果有錯誤則傳回-1。

EINTR 此調用被中斷。

sigprocmask(查詢或設定信号遮罩)

相關函數 signal,sigaction,sigpending,sigsuspend

定義函數 int sigprocmask(int how,const sigset_t *set,sigset_t * oldset);

函數說明 sigprocmask()可以用來改變目前的信号遮罩,其操作依參數how來決定

SIG_BLOCK 新的信号遮罩由目前的信号遮罩和參數set 指定的信号遮罩作聯集

SIG_UNBLOCK 将目前的信号遮罩删除掉參數set指定的信号遮罩

SIG_SETMASK 将目前的信号遮罩設成參數set指定的信号遮罩。

如果參數oldset不是NULL指針,那麼目前的信号遮罩會由此指針傳回。

錯誤代碼 EFAULT 參數set,oldset指針位址無法存取。

sleep(讓程序暫停執行一段時間)

相關函數 signal,alarm

定義函數 unsigned int sleep(unsigned int seconds);

函數說明 sleep()會令目前的程序暫停,直到達到參數seconds 所指定的時間,或是被信号所中斷。

傳回值 若程序暫停到參數seconds 所指定的時間則傳回0,若有信号中斷則傳回剩餘秒數。

    本文轉自 OldHawk  部落格園部落格,原文連結:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html,如需轉載請自行聯系原作者

繼續閱讀