文档章节

捕捉SIGUSR1和SIGUSR2的简单程序

独钓渔
 独钓渔
发布于 2016/11/21 18:05
字数 409
阅读 116
收藏 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

共有 人打赏支持
独钓渔
粉丝 47
博文 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
788
0

没有更多内容

加载失败,请刷新页面

加载更多

缓存穿透,缓存雪崩的四种解决方案

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑...

小致dad
26分钟前
2
0
PHP 文字生成透明图片之路

摘要:在现在的开发中会经常运用到生成图片的功能,常用的验证码生成等。PHP语言生成图片需要用到GD2功能模块,所以基本的图片,图形处理都是没什么压力滴。 准备: 1、打开GD2模块,在php.i...

昙花一现
26分钟前
0
0
impala系列: 基本命令和jdbc连接

--======================= 使用impala-shell 登录 --======================= impala-shell --auth_creds_ok_in_clear -l -i ip_address -u user_name --======================= JDBC dri......

hblt-j
27分钟前
1
0
CSS实例详解:Flex布局

本文由云+社区发表 本文将通过三个简单的实例,实际应用上篇文章的基础理论知识,展示下Flex布局是如何解决CSS布局问题。 一.垂直居中 这里同时用非flex布局和flex布局两种方式来实现,可以...

腾讯云加社区
33分钟前
6
0
安装全局webpack

https://www.jianshu.com/p/119a825d8bba npm ls webpack 和npm ls webpack -g 查看本地和全局版本 npm install webpack@1.15.0 -g 全局 然后到项目里面 npm install npm init npm install w......

lsy999
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部