APUE学习笔记——10信号——信号接口函数 signal 和 sigaction
signal函数
- #include <signal.h>
- void (*signal(int signo,void (*func)(int)))(int);
- Returns: previous disposition of signal (see following) if OK,SIG_ERR on error
function)。
- #define SIG_ERR (void (*)())-1
- #define SIG_DFL (void (*)())0
- #define SIG_IGN (void (*)())
- typedef void Sigfunc(int);
- Sigfunc *signal(int, Sigfunc *)
- #include "apue.h"
- #include "myerr.h"
- static void sig_usr(int); /* one handler for both signals */
- int
- main(void)
- {
- if (signal(SIGUSR1, sig_usr) == SIG_ERR)
- err_sys("can’t catch SIGUSR1");
- if (signal(SIGUSR2, sig_usr) == SIG_ERR)
- err_sys("can’t catch SIGUSR2");
- for ( ; ; )
- pause();
- }
- static void
- sig_usr(int signo) /* argument is signal number */
- {
- if (signo == SIGUSR1)
- printf("received SIGUSR1\n");
- else if (signo == SIGUSR2)
- printf("received SIGUSR2\n");
- else
- err_dump("received signal %d\n", signo);
- }
- ~
- windeal@ubuntu:~/Windeal/apue$ ./exe &
- [1] 2982
- windeal@ubuntu:~/Windeal/apue$ kill -USR1 2982
- windeal@ubuntu:~/Windeal/apue$ received SIGUSR1
- kill -USR2 2982
- received SIGUSR2
- windeal@ubuntu:~/Windeal/apue$ kill 2982
- [1]+ Terminated ./exe
- windeal@ubuntu:~/Windeal/apue$
新程序的启动 与signal的缺陷
- void sig_int(int), sig_quit(int);
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, sig_int);
- if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
- signal(SIGQUIT, sig_quit);
SIG_IGN)!=
SIG_IGN) 就为假signal(SIGINT,
sig_int);就不执行。而判断句中的signal(SIGQUIT,
SIG_IGN)只是继续把信号处理方式重复设置为忽略(相当于没做处理)
- /* STATUS_1 */
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- /* STATUS_2 */
- signal(SIGINT, sig_int);
- /* STATUS_3 */
SIG_IGN),然后进入STATUS_3,仍然为忽略状态。
SIG_IGN) 将信号处理方式也设为忽略(也就是说进入STATUS_2时,STATUS_2中信号的处理方式为忽略),但是
signal(SIGINT,
sig_int)又将信号处理方式设置为捕获,且捕获函数为sig_int。因此STATUS_3时,信号的处理方式为sig_int捕获。
sigaction函数
- #include <signal.h>
- int sigaction(int signo,const struct sigaction *restrict act,struct sigaction *restrict oact);
- Returns: 0 if OK,−1 on error
- struct sigaction {
- void (*sa_handler)(int); /* addr of signal handler, */
- /* or SIG_IGN, or SIG_DFL */
- sigset_t sa_mask; /* additional signals to block */
- int sa_flags; /* signal options, Figure 10.16 */
- /* alternate handler */
- void (*sa_sigaction)(int, siginfo_t *, void *);
- };
这样,调用信号处理函数时,就能阻塞信号。如下所示:
- //设置新的信号屏蔽字, 阻塞信号
- sigaction(signo, act, oact);//调用sigaction函数
- //复位信号屏蔽字
- sa_sigaction(int signo, siginfo_t* info,void *context);
- sa_handler(signo);
- struct siginfo {
- int si_signo; /* signal number */
- int si_errno; /* if nonzero, errno value from errno.h */
- int si_code; /* additional info (depends on signal) */
- pid_t si_pid; /* sending process ID */
- uid_t si_uid; /* sending process real user ID */
- void *si_addr; /* address that caused the fault */
- int si_status; /* exit value or signal number */
- union sigval si_value; /* application-specific value */
- /* possibly other fields also */
- };
- union sigval{
- int sival_int;
- void *sival_ptr;
- }
Example
- #include "apue.h"
- /* Reliable version of signal(), using POSIX sigaction(). */
- Sigfunc *
- signal(int signo, Sigfunc *func)
- {
- struct sigaction act, oact;
- act.sa_handler = func;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- if (signo == SIGALRM) {
- #ifdef SA_INTERRUPT
- act.sa_flags |= SA_INTERRUPT;
- #endif
- }else {
- act.sa_flags |= SA_RESTART;
- }
- if (sigaction(signo, &act, &oact) < 0)
- return(SIG_ERR);
- return(oact.sa_handler);
- }
APUE学习笔记——10信号——信号接口函数 signal 和 sigaction的更多相关文章
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- APUE学习笔记——10.可靠信号与不可靠信号
首先说明:现在大部分Unix系系统如Linux都已经实现可靠信号. 1~31信号与SIGRTMIN-SIGRTMAX之间并不是可靠信号与不可靠信号的区别,在大多数系统下他们都是可靠信号. 只不过: 1 ...
- APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号
如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...
- APUE学习笔记——10.18 system函数 与waitpid
system函数 system函数用方便在一个进程中执行命令行(一行shell命令). 用法如下: #include <stdio.h> #include <stdlib.h> ...
- APUE学习笔记——10.15 sigsetjmp和siglongjmp
转载自:sigsetjmp使用方法 如侵犯您的权益,请联系:windeal12@qq.com sigsetjmp使用方法 分类: c/c++ linux2012-02-03 12:33 1252人阅读 ...
- APUE学习笔记——10 信号
信号的基本概念 信号是软件中断,信号提供了解决异步时间的方法. 每一中信号都有一个名字,信号名以SIG开头. 产生信号的几种方式 很多条件可以产生信号: 终端交互:用户 ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
随机推荐
- 【分库分表】sharding-jdbc—分片策略
一.分片策略 Sharding-JDBC认为对于分片策略存有两种维度: 数据源分片策略(DatabaseShardingStrategy):数据被分配的目标数据源 表分片策略(TableShardin ...
- Linux各目录缩写含义
Unix已经有35年历史了.许多人认为它开始于中世纪,这个中世纪是相对于计算机技术的产生和发展来说的.在过去的时间里,Unix和它的子分支Linux收集有许多的历史和一些完全古老的语言.在这篇技巧文章 ...
- COGS 723. [SDOI2007] 超级数组
★★☆ 输入文件:arr.in 输出文件:arr.out 简单对比 时间限制:1 s 内存限制:3 MB Source: SDOI2007 Day2[问题描述] 一般的数组大家都经常 ...
- SaltStack部署服务及配置管理apache+php-第二篇
实验目标 1.使用SaltStack部署apache和php, 2.使用salt管理httpd.conf配置文件配置访问info.php使用账户密码 3.在salt里面增加对conf.d目录进行配置管 ...
- Spring Boot CRUD+分页(基于Mybatis注解方式)
步骤一:关于Mybatis Mybatis 是用来进行数据库操作的框架.其中分页使用Mybatis中的PageHelper插件. Mybatis与hibernate对比: 1.hibernate是一个 ...
- intellij idea rearrange code
reformat code的时候,无法将filed放在method前边,很恶心. 那么先去
- 【论文解析】MTCNN论文要点翻译
目录 0.论文连接 1.前言 2.论文Abstract翻译 3.论文的主要贡献 4.4 训练 5 模型性能分析 5.1 关于在线挖掘困难样本的性能 5.2 将人脸检测与对齐联合的性能 5.3 人脸检测 ...
- centos vsftp 500 OOPS: cannot change directory:/home/ftp
系统是CentOS,是RH派系的.我把vsftpd安装配置好了,以为大功告成,但客户端访问提示如下错误:500 OOPS: cannot change directory:/home/ftp原因是他的 ...
- c语言的tcp和udp客户端和服务器
都是最简单的用来记忆. this is my 的git地址:https://github.com/yanjinyun/cLanguageTcpUdp tcp最简单的服务器: int main(int ...
- Spring ApplicationListener 理解
在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化环境,准备测试数据.加载一些数据到内存等等. 在spring中可以通过ApplicationListener来实现相关的功能,加载完成 ...