Linux 訊號signal處理函式--轉

weixin_33860553發表於2014-01-14

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>
#include<signal.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<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>
main()
{
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);
sleep(1);
kill(pid ,SIGABRT);
wait(&status);
if(WIFSIGNALED(status))
printf("chile process receive signal %d/n",WTERMSIG(status));
}
}

執行

Hi I am child process!
send signal to child process(13700)
child process receive signal 6

 

 


pause(讓程式暫停直到訊號出現)
相關函式 kill,signal,sleep

表標頭檔案 #include<unistd.h>

定義函式 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 返回。

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

錯誤程式碼

EINVAL 引數signum 不合法,或是企圖攔截SIGKILL/SIGSTOPSIGKILL訊號
EFAULT 引數act,oldact指標地址無法存取。
EINTR 此呼叫被中斷

參考:

<signal.h>

http://opengroup.org/onlinepubs/007908775/xsh/sigaction.html

http://opengroup.org/onlinepubs/007908775/xsh/signal.h.html

 

範例

#include<unistd.h>
#include<signal.h>
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);
}
}
main()
{
int i;
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

表標頭檔案 #include<signal.h>

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

函式說明 sigaddset()用來將引數signum 代表的訊號加入至引數set 訊號集裡。

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

錯誤程式碼 EFAULT 引數set指標地址無法存取
EINVAL 引數signum非合法的訊號編號

 

 


sigdelset(從訊號集裡刪除一個訊號)
相關函式 sigemptyset,sigfillset,sigaddset,sigismember

表標頭檔案 #include<signal.h>

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

函式說明 sigdelset()用來將引數signum代表的訊號從引數set訊號集裡刪除。

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

錯誤程式碼 EFAULT 引數set指標地址無法存取
EINVAL 引數signum非合法的訊號編號

 

 


sigemptyset(初始化訊號集)
相關函式 sigaddset,sigfillset,sigdelset,sigismember

表標頭檔案 #include<signal.h>

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

函式說明 sigemptyset()用來將引數set訊號集初始化並清空。

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

錯誤程式碼 EFAULT 引數set指標地址無法存取

 

 


sigfillset(將所有訊號加入至訊號集)
相關函式 sigempty,sigaddset,sigdelset,sigismember

表標頭檔案 #include<signal.h>

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

函式說明 sigfillset()用來將引數set訊號集初始化,然後把所有的訊號加入到此訊號集裡。

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

附加說明 EFAULT 引數set指標地址無法存取

 

 


sigismember(測試某個訊號是否已加入至訊號集裡)
相關函式 sigemptyset,sigfillset,sigaddset,sigdelset

表標頭檔案 #include<signal.h>

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

函式說明 sigismember()用來測試引數signum 代表的訊號是否已加入至引數set訊號集裡。如果訊號集裡已有該訊號則返回1,否則返回0。

返回值訊號集已有該訊號則返回1,沒有則返回0。如果有錯誤則返回-1。

錯誤程式碼 EFAULT 引數set指標地址無法存取
EINVAL 引數signum 非合法的訊號編號

 

 


signal(設定訊號處理方式)
相關函式 sigaction,kill,raise

表標頭檔案 #include<signal.h>

定義函式 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

表標頭檔案 #include<signal.h>

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

函式說明 sigpending()會將被擱置的訊號集合由引數set指標返回。

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

錯誤程式碼 EFAULT 引數set指標地址無法存取
EINTR 此呼叫被中斷。

 

 


sigprocmask(查詢或設定訊號遮罩)
相關函式 signal,sigaction,sigpending,sigsuspend

表標頭檔案 #include<signal.h>

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

函式說明 sigprocmask()可以用來改變目前的訊號遮罩,其操作依引數how來決定
SIG_BLOCK 新的訊號遮罩由目前的訊號遮罩和引數set 指定的訊號遮罩作聯集
SIG_UNBLOCK 將目前的訊號遮罩刪除掉引數set指定的訊號遮罩
SIG_SETMASK 將目前的訊號遮罩設成引數set指定的訊號遮罩。
如果引數oldset不是NULL指標,那麼目前的訊號遮罩會由此指標返回。

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

錯誤程式碼 EFAULT 引數set,oldset指標地址無法存取。
EINTR 此呼叫被中斷

 

 


sleep(讓程式暫停執行一段時間)
相關函式 signal,alarm

表標頭檔案 #include<unistd.h>

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

函式說明 sleep()會令目前的程式暫停,直到達到引數seconds 所指定的時間,或是被訊號所中斷。

返回值 若程式暫停到引數seconds 所指定的時間則返回0,若有訊號中斷則返回剩餘秒數。

相關文章