我是靠谱客的博主 优雅煎蛋,最近开发中收集的这篇文章主要介绍Linux+信号+sigusr,Linux的SIGUSR1和SIGUSR2信號,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

SIGUSR1 用戶自定義信號 默認處理:進程終止

SIGUSR2 用戶自定義信號 默認處理:進程終止

當一個進程調用fork時,因為子進程在開始時復制父進程的存儲映像,信號捕捉函數的地址在子進程中是有意義的,所以子進程繼承父進程的信號處理方式。

但是當子進程調用exec后,因為exec運行新的程序后會覆蓋從父進程繼承來的存儲映像,那么信號捕捉函數在新程序中已無意義,所以exec會將原先設置為要捕捉的信號都更改為默認動作。

C++父子進程使用SIGUSR1和SIGUSR2進行通信

#include

#include

#include

#include

#include

void handler(int signo)

{

switch(signo) {

case SIGUSR1: //處理信號 SIGUSR1

printf("Parent : catch SIGUSR1n");

break;

case SIGUSR2: //處理信號 SIGUSR2

printf("Child : catch SIGUSR2n");

break;

default: //本例不支持

printf("Should not be heren");

break;

}

}

int main(void)

{

pid_t ppid, cpid;

//為兩個信號設置信號處理函數

if(signal(SIGUSR1, handler) == SIG_ERR)

{ //設置出錯

perror("Can't set handler for SIGUSR1n");

exit(1);

}

if(signal(SIGUSR2, handler) == SIG_ERR)

{ //設置出錯

perror("Can't set handler for SIGUSR2n");

exit(1);

}

ppid = getpid();//得到父進程ID

if((cpid = fork()) < 0)

{

perror("fail to forkn");

exit(1);

}

else if(cpid == 0)

{

// 子進程內向父進程發送信號SIGUSER1

if(kill(ppid, SIGUSR1) == -1)

{

perror("fail to send signaln");

exit(1);

}

while(1);//死循環,等待父進程的信號

}

else

{

sleep(1);//休眠,保證子進程先運行,並且發送SIGUSR1信號

// 父進程向自己發送SIGUSER2信號

if(kill(cpid, SIGUSR2) == -1)

{

perror("fail to send signaln");

exit(1);

}

// 必須sleep一下,否則子進程捕獲不到SIGUSER2信號

sleep(1);

printf("will kill childn");//輸出提示

if(kill(cpid, SIGKILL) == -1)

{ //發送SIGKILL信號,殺死子進程

perror("fail to send signaln");

exit(1);

}

if(wait(NULL) ==-1)

{ //回收子進程狀態,避免僵屍進程

perror("fail to waitn");

exit(1);

}

printf("child has been killed.n");

}

return;

}

捕捉SIGUSR1和SIGUSR2的簡單程序

#include

#include

#include

static void sig_usr(int);

int main(void)

{

if(signal(SIGUSR1, sig_usr) == SIG_ERR)

printf("can not catch SIGUSR1n");

if(signal(SIGUSR2, sig_usr) == SIG_ERR)

printf("can not catch SIGUSR2n");

for(;;)

pause();

}

static void sig_usr(int signo)

{

if(signo == SIGUSR1)

printf("received SIGUSR1n");

else if(signo == SIGUSR2)

printf("received SIGUSR2n");

else

printf("received signal %dn", signo);

}

運行結果:

[chinsung@thinkpad apue]$ ./a.out &

[1] 2581

[chinsung@thinkpad apue]$ kill -USR1 2581

received SIGUSR1

[chinsung@thinkpad apue]$ kill -USR2 2581

received SIGUSR2

[chinsung@thinkpad apue]$ kill 2581

[1]+ Terminated ./a.out

最后

以上就是优雅煎蛋为你收集整理的Linux+信号+sigusr,Linux的SIGUSR1和SIGUSR2信號的全部内容,希望文章能够帮你解决Linux+信号+sigusr,Linux的SIGUSR1和SIGUSR2信號所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部