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 SIGUSR1\n");

break;

case SIGUSR2: //處理信號 SIGUSR2

printf("Child : catch SIGUSR2\n");

break;

default: //本例不支持

printf("Should not be here\n");

break;

}

}

int main(void)

{

pid_t ppid, cpid;

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

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

{ //設置出錯

perror("Can't set handler for SIGUSR1\n");

exit(1);

}

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

{ //設置出錯

perror("Can't set handler for SIGUSR2\n");

exit(1);

}

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

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

{

perror("fail to fork\n");

exit(1);

}

else if(cpid == 0)

{

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

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

{

perror("fail to send signal\n");

exit(1);

}

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

}

else

{

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

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

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

{

perror("fail to send signal\n");

exit(1);

}

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

sleep(1);

printf("will kill child\n");//輸出提示

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

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

perror("fail to send signal\n");

exit(1);

}

if(wait(NULL) ==-1)

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

perror("fail to wait\n");

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 SIGUSR1\n");

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

printf("can not catch SIGUSR2\n");

for(;;)

pause();

}

static void sig_usr(int signo)

{

if(signo == SIGUSR1)

printf("received SIGUSR1\n");

else if(signo == SIGUSR2)

printf("received SIGUSR2\n");

else

printf("received signal %d\n", 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值