linux中信号的处理,linux中关于信号处理笔记(二)
2 等待一个全局变量被设置
这种情况是等待一个信号处理程序设置一个全局变量。下面的例子用于捕捉中断信号和退出信号,但是希望仅当退出信号处理程序时,才唤醒主进程。
#include
#include
#include
volatile sig_atomic_t quitflag;
/*
当把声明为该类型会保证该变量在使用或赋值时, 无论是在32位还是64位的机器上都能保证操作是原子的, 它会根据机器的类型自动适应。这个类型是定义在signal.h文件中。*/
static void sig_int(int signo)
{
if(signo == SIGINT)
printf("\ninterrupt\n");
else if(signo == SIGQUIT)
quitflag = 1;//等待这个全局变量
}
int main(void)
{
sigset_t newmask, oldmask, zeromask;
if(signal(SIGINT, sig_int) == SIG_ERR)
{
printf("signal(SIGINT) error");
exit(1);
}
if(signal(SIGQUIT, sig_int) == SIG_ERR)
{
printf("signal(SIGQUIT) error");
exit(1);
}
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT);
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//屏蔽SIGQUIT信号
{
printf("SIG_BLOCK error");
exit(1);
}
while(quitflag == 0)
{
sigsuspend(&zeromask);//sigsuspend解开所有屏蔽信号,然后等待quitflag变成1,然后才往下执行,否则在这里循环
printf("quitflag = %d\n", quitflag);
}
quitflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
printf("SIG_SETMASK error");
exit(1);
}
exit(0);
}
由显示结果可以看出,sigsuspend放开屏蔽信号,按下“ctrl+C”,进入中断,但是不设置quitflag,直到按下“ctrl+\”,quitflag置1,才往下执行。
在单进程程序当中,主进程和中断共享变量,这不失为一种好办法。
3 父子进程通信,关于这个只有几个函数。在此不做记录。
另外重点说下sigaction函数:
int sigaction(int signo, const struct sigaction *restrict act, struct *restrictoact);
这个函数用来修改或者检查与指定信号相关联的处理动作,其中,参数signo是要检测或者修改其具体动作的信号编号,若act指针非空,
则要修改其动作,若oact非空,则系统由oact指针返回该信号的上一个动作。其中的结构体如下:
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int, siginfo_t *, void *);
};
关于这个函数可以这样理解:如果sa_handler字段有效,即这个字段是一个有效信号捕捉地址,则sa_mask字段信号集是这样的
在调用该捕捉函数前,这一信号集要加到进程的信号屏蔽字中,仅当从信号捕捉函数返回时再将进程的信号屏蔽字恢复到原来状态
这样,在信号处理函数调用时,就能阻塞某些信号,即在执行信号处理程序时,系统新建立的信号能被屏蔽,保证了在信号处理过程当中,
如果同一种信号再次发生,那么它会被阻塞到前一个新红处理完毕。例如:
int main(void)
{
int i = 0;
structsigactionact, oldact;
act.sa_handler = show_handler;
...
sigaddset(&act.sa_mask, SIGQUIT);
....
sigaction(SIGINT, &act, &oldact);
while(1) {
sleep(1);
printf("sleeping %d\n", i);
i++;
}}
上面函数设置SIGINT捕捉函数,在从SIGINT信号处理函数返回以前,把SIGQUIT信号屏蔽,从信号处理函数返回以后,恢复原来的信号屏蔽字。
这样即使在信号处理过程当中产生SIGQUIT信号,在接触屏蔽以后,信号SIGQUIT也能递达而不丢失。
linux中信号的处理,linux中关于信号处理笔记(二)相关推荐
- html 对p中一段话指定样式,HTML5学习笔记(二)
一.常用标签 1.< p> 标签:段落标签,用来显示一段文本 段落文本 2.< h> 标签:从 h1-h6字体越来越大.标题标签. 一级标题 二级标题 三级标题 四级标题 五级 ...
- linux 系统对信号的处理,Linux下的信号处理函数总结
1.信号处理函数 相关函数原型如下: #include sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处 ...
- linux 屏蔽信号 sig_kill sig_stop,linux 信号处理
曾做过signal相关的一点儿开发,谈谈我的一些理解. 首先,需要理解几个signal相关的函数. sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sig ...
- Linux 进程信号
目录 什么是信号 生活中的角度 技术中的角度 PS 信号概念 kiil -l 查看所有信号 对于信号的分析 关于信号的产生(信号产生前) 1. 通过终端按键产生信号 2. 调用系统函数向进程发信号 3 ...
- linux进程中对信号的屏蔽,linux进程中的信号屏蔽
在linux的进程中可以接收到各种的信号,并且如果你不对信号进行处理,linux中的进程就会采用默认的处理方式处理,比如ctrl-c的信号,进程对它的处理就是终止进程的执行. 在linux中,我们也可 ...
- linux用信号写代码,Python 信号(linux) 源代码放附件中
Python信号 果汁味 信号的概念 信号(signal)--进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT终止进程中断 ...
- 【关于Linux中----信号】
文章目录 一.信号入门 1.1 信号概念 1.2 用 kill-l命令查看信号列表 1.3 信号处理常见方式预览 二.产生信号 2.1 通过终端按键产生信号 2.2 由于程序中存在异常产生信号 2.3 ...
- linux通过信号回调函数,信号机制的管理结构 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...
信号只是一个数字,数字为0-31表示不同的信号,如下表所示. 编号 信号名 默认动作 说明 1 SIGHUP 进程终止 终端断开连接 2 SIGINT 进程终止 用户在键盘上按下CTRL+C 3 SI ...
- 在linux系统中 下列哪些信号无法捕获,下列哪个选项不是 Linux 系统中信号的状态。...
下列哪个选项不是 Linux 系统中信号的状态. 更多相关问题 通 过 和他人的 谈话 . 观 察 市场 情况 等也 可以 获得 大量 的信 息 , 特 别 是 通过 人们 在日常生活 中 的 抱 怨 ...
最新文章
- JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
- TestNG测试框架之失败测试重跑
- 网络编程中的锁与队列
- [APIO2010]
- 网页制作中的背景处理
- 英语语法---形容词短语详解
- .NET中的Assembly分析
- 人人都喜欢用的十大python标准库
- vue 自定义打印CLodop
- wps演示怎么提高列表级别_wps文字如何设置标题级别?wps设置标题级别教程
- 解决方案:Win C++ mingw编译器出现 不支持的16位程序问题
- 免费服务器推荐1:无限自由
- 我的世界python——方块朋友(方块设置移动路径getline)
- java constants_Java Constants类代码示例
- Hexo Icarus配置和美化升级
- win7连接远程桌面时出现黑屏的解决方法(亲测有效)——终于找到解决办法了
- hash函数原理实现
- gitBash快速清屏,git命令行操作,快速清屏,清屏
- 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows
- 51单片机与蜂鸣器实现摩斯密码转换。