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

");

break;

case SIGUSR2: //处理信号 SIGUSR2

printf("Child : catch SIGUSR2

");

break;

default: //本例不支持

printf("Should not be here

");

break;

}

}

int main(void)

{

pid_t ppid, cpid;

//为两个信号设置信号处理函数

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

{ //设置出错

perror("Can't set handler for SIGUSR1

");

exit(1);

}

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

{ //设置出错

perror("Can't set handler for SIGUSR2

");

exit(1);

}

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

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

{

perror("fail to fork

");

exit(1);

}

else if(cpid == 0)

{

// 子进程内向父进程发送信号SIGUSER1

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

{

perror("fail to send signal

");

exit(1);

}

while(1);//死循环,等待父进程的信号

}

else

{

sleep(1);//休眠,保证子进程先运行,并且发送SIGUSR1信号

// 父进程向自己发送SIGUSER2信号

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

{

perror("fail to send signal

");

exit(1);

}

// 必须sleep一下,否则子进程捕获不到SIGUSER2信号

sleep(1);

printf("will kill child

");//输出提示

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

{ //发送SIGKILL信号,杀死子进程

perror("fail to send signal

");

exit(1);

}

if(wait(NULL) ==-1)

{ //回收子进程状态,避免僵尸进程

perror("fail to wait

");

exit(1);

}

printf("child has been killed.

");

}

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

");

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

printf("can not catch SIGUSR2

");

for(;;)

pause();

}

static void sig_usr(int signo)

{

if(signo == SIGUSR1)

printf("received SIGUSR1

");

else if(signo == SIGUSR2)

printf("received SIGUSR2

");

else

printf("received signal %d

", 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、付费专栏及课程。

余额充值