文档章节

捕捉SIGUSR1和SIGUSR2的简单程序

独钓渔
 独钓渔
发布于 2016/11/21 18:05
字数 409
阅读 91
收藏 0

捕捉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收到信号过后,按照约定(注册的信号处理函数)进行了相应的处理(打印进程信息)。

本文转载自:http://www.cnblogs.com/chenyadong/archive/2011/10/11/2207985.html

共有 人打赏支持
独钓渔
粉丝 48
博文 375
码字总数 142587
作品 0
沙坪坝
系统管理员
Unix环境高级编程笔记 :10、信号

信号是软件中断,信号提供了一种处理异步事件的方法。 1、信号概念 每个信号都有一个名字,这些名字都以三个字符SIG开头。 SIGABRT是夭折信号,当进程调用abort函数时产生这种信号 SIGALRM是...

活的很快乐
2013/11/15
0
0
对信号函数sigaction的sa_mask的学习

#include "apue.h" static void sigparse1(int sig,siginfo_t * param,void * p2){ prmask("in sigparse1: "); // prmask("in sigparse1: "); 打印in sigparse1: 当前屏蔽信号 //raise(SIGU......

B_ice
2016/07/27
222
0
linux司机售票员问题

/* *基于信号处理的司机与售票员进程同步问题 *题目要求:SIGINT(表开车),由售票员接收,发送信号SIGUSR1给司机,司机打印run the bus *SIGQUIT(表停车),由售票员接收,发信号SIGUSR2给司机,...

斯多葛先生
2016/06/02
94
0
Linux 多线程应用中编写安全的信号处理函数

Linux 多线程应用中编写安全的信号处理函数 在 开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量。如果应用中使用了信号,而且信号的产生不是因为 程序...

WuHonghai
2012/05/10
0
0
GLib 2.36.0 发布,C 程序工具包

GLib 是一个包含很多有用的 C 程序的开发包,例如树、哈希、列表等。GLib 之前是属于 GTK 工具包的一部分,现在独立出来成为单独项目。 GLib 2.36.0 改进记录: Signal handlers connected ...

oschina
2013/03/28
739
0

没有更多内容

加载失败,请刷新页面

加载更多

cacti监控安装

cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。 cacti官方推...

hiwill
19分钟前
1
0
shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
48分钟前
1
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
今天
3
0
linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
2
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部