捕捉SIGUSR1和SIGUSR2的简单程序
捕捉SIGUSR1和SIGUSR2的简单程序
独钓渔 发表于1年前
捕捉SIGUSR1和SIGUSR2的简单程序
  • 发表于 1年前
  • 阅读 24
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 捕捉SIGUSR1和SIGUSR2的简单程序

捕捉SIGUSR1和SIGUSR2的简单程序

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

static void sig_usr(int);
int main(void)
{
        if(signal(SIGUSR1, sig_usr) == SIG_ERR)
                printf("can't catch SIGUSR1\n");
        if(signal(SIGUSR2, sig_usr) == SIG_ERR)
                printf("can't 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

说明:
void sig_usr(int)为signal handler函数,用于注册信号,其实现也只是将接收到的信号打印出来而已,对SIGUSR1和SIGUSR2两种信号特别一些,直接打印出其信号名。

在main函数中,先是注册了两个信号:SIGUSR1和SIGUSR2,然后是一个死循环,使用pause不断的接收信号,并没有退出循环的相应机制,只能使用kill命令结束进程。

于是到现在,这个小程序便比较容易理解了,程序先使用signal函数将SIGUSR1和SIGUSR2两个信号注册到sig_usr信号处理函数上去,而信号处理函数sig_usr对信号的处理策略为:如果是SIGUSR1或SIGUSR2两种信号,打印出其信号类型,否则打印其信号值。

无意间,我们已经做了一次进程间通信:执行kill命令的进程将SIGUSR1或SIGUSR2信号传送给了进程id为2581的进程,而进程2581收到信号过后,按照约定(注册的信号处理函数)进行了相应的处理(打印进程信息)。

共有 人打赏支持
粉丝 46
博文 366
码字总数 137272
×
独钓渔
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: