日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux 信号signal处理函数

發(fā)布時(shí)間:2023/12/10 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 信号signal处理函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

alarm(設(shè)置信號(hào)傳送鬧鐘)
相關(guān)函數(shù) signal,sleep

表頭文件 #include<unistd.h>

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

函數(shù)說(shuō)明 alarm()用來(lái)設(shè)置信號(hào)SIGALRM在經(jīng)過(guò)參數(shù)seconds指定的秒數(shù)后傳送給目前的進(jìn)程。如果參數(shù)seconds 為0,則之前設(shè)置的鬧鐘會(huì)被取消,并將剩下的時(shí)間返回。

返回值返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回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);
}
}

執(zhí)行 sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...

 

?


kill(傳送信號(hào)給指定的進(jìn)程)
相關(guān)函數(shù) raise,signal

表頭文件 #include<sys/types.h>
#include<signal.h>

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

函數(shù)說(shuō)明 kill()可以用來(lái)送參數(shù)sig指定的信號(hào)給參數(shù)pid指定的進(jìn)程。參數(shù)pid有幾種情況:
pid>0 將信號(hào)傳給進(jìn)程識(shí)別碼為pid 的進(jìn)程。
pid=0 將信號(hào)傳給和目前進(jìn)程相同進(jìn)程組的所有進(jìn)程
pid=-1 將信號(hào)廣播傳送給系統(tǒng)內(nèi)所有的進(jìn)程
pid<0 將信號(hào)傳給進(jìn)程組識(shí)別碼為pid絕對(duì)值的所有進(jìn)程
參數(shù)sig代表的信號(hào)編號(hào)可參考附錄D

返回值 執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EINVAL 參數(shù)sig 不合法
ESRCH 參數(shù)pid 所指定的進(jìn)程或進(jìn)程組不存在
EPERM 權(quán)限不夠無(wú)法傳送信號(hào)給指定進(jìn)程

范例 #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));
}
}

執(zhí)行 sen signal to child process(3170)
Hi I am child process!
child process receive signal 6

 

?


pause(讓進(jìn)程暫停直到信號(hào)出現(xiàn))
相關(guān)函數(shù) kill,signal,sleep

表頭文件 #include<unistd.h>

定義函數(shù) int pause(void);

函數(shù)說(shuō)明 pause()會(huì)令目前的進(jìn)程暫停(進(jìn)入睡眠狀態(tài)),直到被信號(hào)(signal)所中斷。

返回值 只返回-1。

錯(cuò)誤代碼 EINTR 有信號(hào)到達(dá)中斷了此函數(shù)。

 

?


sigaction(查詢(xún)或設(shè)置信號(hào)處理方式)
相關(guān)函數(shù) signal,sigprocmask,sigpending,sigsuspend

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigaction()會(huì)依參數(shù)signum指定的信號(hào)編號(hào)來(lái)設(shè)置該信號(hào)的處理函數(shù)。參數(shù)signum可以指定SIGKILL和SIGSTOP以外的所有信號(hào)。
如參數(shù)結(jié)構(gòu)sigaction定義如下
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
sa_handler此參數(shù)和signal()的參數(shù)handler相同,代表新的信號(hào)處理函數(shù),其他意義請(qǐng)參考signal()。
sa_mask 用來(lái)設(shè)置在處理該信號(hào)時(shí)暫時(shí)將sa_mask 指定的信號(hào)擱置。
sa_restorer 此參數(shù)沒(méi)有使用。
sa_flags 用來(lái)設(shè)置信號(hào)處理的其他相關(guān)操作,下列的數(shù)值可用。
OR 運(yùn)算(|)組合
A_NOCLDSTOP : 如果參數(shù)signum為SIGCHLD,則當(dāng)子進(jìn)程暫停時(shí)并不會(huì)通知父進(jìn)程
SA_ONESHOT/SA_RESETHAND:當(dāng)調(diào)用新的信號(hào)處理函數(shù)前,將此信號(hào)處理方式改為系統(tǒng)預(yù)設(shè)的方式。
SA_RESTART:被信號(hào)中斷的系統(tǒng)調(diào)用會(huì)自行重啟
SA_NOMASK/SA_NODEFER:在處理此信號(hào)未結(jié)束前不理會(huì)此信號(hào)的再次到來(lái)。
如果參數(shù)oldact不是NULL指針,則原來(lái)的信號(hào)處理方式會(huì)由此結(jié)構(gòu)sigaction 返回。

返回值 執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EINVAL 參數(shù)signum 不合法,或是企圖攔截SIGKILL/SIGSTOPSIGKILL信號(hào)
EFAULT 參數(shù)act,oldact指針地址無(wú)法存取。
EINTR 此調(diào)用被中斷

范例 #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);
}
}

執(zhí)行 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(增加一個(gè)信號(hào)至信號(hào)集)
相關(guān)函數(shù) sigemptyset,sigfillset,sigdelset,sigismember

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigaddset()用來(lái)將參數(shù)signum 代表的信號(hào)加入至參數(shù)set 信號(hào)集里。

返回值執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EFAULT 參數(shù)set指針地址無(wú)法存取
EINVAL 參數(shù)signum非合法的信號(hào)編號(hào)

 

?


sigdelset(從信號(hào)集里刪除一個(gè)信號(hào))
相關(guān)函數(shù) sigemptyset,sigfillset,sigaddset,sigismember

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigdelset()用來(lái)將參數(shù)signum代表的信號(hào)從參數(shù)set信號(hào)集里刪除。

返回值 執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EFAULT 參數(shù)set指針地址無(wú)法存取
EINVAL 參數(shù)signum非合法的信號(hào)編號(hào)

 

?


sigemptyset(初始化信號(hào)集)
相關(guān)函數(shù) sigaddset,sigfillset,sigdelset,sigismember

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigemptyset()用來(lái)將參數(shù)set信號(hào)集初始化并清空。

返回值 執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EFAULT 參數(shù)set指針地址無(wú)法存取

 

?


sigfillset(將所有信號(hào)加入至信號(hào)集)
相關(guān)函數(shù) sigempty,sigaddset,sigdelset,sigismember

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigfillset()用來(lái)將參數(shù)set信號(hào)集初始化,然后把所有的信號(hào)加入到此信號(hào)集里。

返回值 執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

附加說(shuō)明 EFAULT 參數(shù)set指針地址無(wú)法存取

 

?


sigismember(測(cè)試某個(gè)信號(hào)是否已加入至信號(hào)集里)
相關(guān)函數(shù) sigemptyset,sigfillset,sigaddset,sigdelset

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigismember()用來(lái)測(cè)試參數(shù)signum 代表的信號(hào)是否已加入至參數(shù)set信號(hào)集里。如果信號(hào)集里已有該信號(hào)則返回1,否則返回0。

返回值信號(hào)集已有該信號(hào)則返回1,沒(méi)有則返回0。如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EFAULT 參數(shù)set指針地址無(wú)法存取
EINVAL 參數(shù)signum 非合法的信號(hào)編號(hào)

 

?


signal(設(shè)置信號(hào)處理方式)
相關(guān)函數(shù) sigaction,kill,raise

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 signal()會(huì)依參數(shù)signum 指定的信號(hào)編號(hào)來(lái)設(shè)置該信號(hào)的處理函數(shù)。當(dāng)指定的信號(hào)到達(dá)時(shí)就會(huì)跳轉(zhuǎn)到參數(shù)handler指定的函數(shù)執(zhí)行。如果參數(shù)handler不是函數(shù)指針,則必須是下列兩個(gè)常數(shù)之一:
SIG_IGN 忽略參數(shù)signum指定的信號(hào)。
SIG_DFL 將參數(shù)signum 指定的信號(hào)重設(shè)為核心預(yù)設(shè)的信號(hào)處理方式。
關(guān)于信號(hào)的編號(hào)和說(shuō)明,請(qǐng)參考附錄D

返回值返回先前的信號(hào)處理函數(shù)指針,如果有錯(cuò)誤則返回SIG_ERR(-1)。

附加說(shuō)明在信號(hào)發(fā)生跳轉(zhuǎn)到自定的handler處理函數(shù)執(zhí)行后,系統(tǒng)會(huì)自動(dòng)將此處理函數(shù)換回原來(lái)系統(tǒng)預(yù)設(shè)的處理方式,如果要改變此操作請(qǐng)改用sigaction()。

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

 

?


sigpending(查詢(xún)被擱置的信號(hào))
相關(guān)函數(shù) signal,sigaction,sigprocmask,sigsuspend

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigpending()會(huì)將被擱置的信號(hào)集合由參數(shù)set指針?lè)祷亍?/p>

返回值執(zhí) 行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EFAULT 參數(shù)set指針地址無(wú)法存取
EINTR 此調(diào)用被中斷。

 

?


sigprocmask(查詢(xún)或設(shè)置信號(hào)遮罩)
相關(guān)函數(shù) signal,sigaction,sigpending,sigsuspend

表頭文件 #include<signal.h>

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

函數(shù)說(shuō)明 sigprocmask()可以用來(lái)改變目前的信號(hào)遮罩,其操作依參數(shù)how來(lái)決定
SIG_BLOCK 新的信號(hào)遮罩由目前的信號(hào)遮罩和參數(shù)set 指定的信號(hào)遮罩作聯(lián)集
SIG_UNBLOCK 將目前的信號(hào)遮罩刪除掉參數(shù)set指定的信號(hào)遮罩
SIG_SETMASK 將目前的信號(hào)遮罩設(shè)成參數(shù)set指定的信號(hào)遮罩。
如果參數(shù)oldset不是NULL指針,那么目前的信號(hào)遮罩會(huì)由此指針?lè)祷亍?/p>

返回值 執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼 EFAULT 參數(shù)set,oldset指針地址無(wú)法存取。
EINTR 此調(diào)用被中斷

 

?


sleep(讓進(jìn)程暫停執(zhí)行一段時(shí)間)
相關(guān)函數(shù) signal,alarm

表頭文件 #include<unistd.h>

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

函數(shù)說(shuō)明 sleep()會(huì)令目前的進(jìn)程暫停,直到達(dá)到參數(shù)seconds 所指定的時(shí)間,或是被信號(hào)所中斷。

返回值 若進(jìn)程暫停到參數(shù)seconds 所指定的時(shí)間則返回0,若有信號(hào)中斷則返回剩余秒數(shù)。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Linux 信号signal处理函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。