Linux的SIGUSR1和SIGUSR2信号
SIGUSR1 用户自定义信号 默认处理:进程终止
SIGUSR2 用户自定义信号 默认处理:进程终止 当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是有意义的,所以子进程继承父进程的信号处理方式。
但是当子进程调用exec后,因为exec运行新的程序后会覆盖从父进程继承来的存储映像,那么信号捕捉函数在新程序中已无意义,所以exec会将原先设置为要捕捉的信号都更改为默认动作。
C++父子进程使用SIGUSR1和SIGUSR2进行通信
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h> void handler(int signo)
{
switch(signo) {
case SIGUSR1: //处理信号 SIGUSR1
printf("Parent : catch SIGUSR1\n");
break;
case SIGUSR2: //处理信号 SIGUSR2
printf("Child : catch SIGUSR2\n");
break;
default: //本例不支持
printf("Should not be here\n");
break;
}
} int main(void)
{
pid_t ppid, cpid;
//为两个信号设置信号处理函数
if(signal(SIGUSR1, handler) == SIG_ERR)
{ //设置出错
perror("Can't set handler for SIGUSR1\n");
exit(1);
} if(signal(SIGUSR2, handler) == SIG_ERR)
{ //设置出错
perror("Can't set handler for SIGUSR2\n");
exit(1);
} ppid = getpid();//得到父进程ID if((cpid = fork()) < 0)
{
perror("fail to fork\n");
exit(1);
}
else if(cpid == 0)
{
// 子进程内向父进程发送信号SIGUSER1
if(kill(ppid, SIGUSR1) == -1)
{
perror("fail to send signal\n");
exit(1);
} while(1);//死循环,等待父进程的信号
}
else
{
sleep(1);//休眠,保证子进程先运行,并且发送SIGUSR1信号
// 父进程向自己发送SIGUSER2信号
if(kill(cpid, SIGUSR2) == -1)
{
perror("fail to send signal\n");
exit(1);
} // 必须sleep一下,否则子进程捕获不到SIGUSER2信号
sleep(1); printf("will kill child\n");//输出提示
if(kill(cpid, SIGKILL) == -1)
{ //发送SIGKILL信号,杀死子进程
perror("fail to send signal\n");
exit(1);
} if(wait(NULL) ==-1)
{ //回收子进程状态,避免僵尸进程
perror("fail to wait\n");
exit(1);
}
printf("child has been killed.\n");
}
return;
}
捕捉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 not catch SIGUSR1\n");
if(signal(SIGUSR2, sig_usr) == SIG_ERR)
printf("can not 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
Linux的SIGUSR1和SIGUSR2信号的更多相关文章
- Linux kill 命令 以及USR1 信号解释
kill 中的USR信号解释 USR1亦通常被用来告知应用程序重载配置文件:例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配 ...
- [Linux]返回被阻塞的信号集
一.概述 在另一篇实例说到,进程可以屏蔽它不想接收的信号集. 事实上这些被屏蔽的信号只是阻塞在内核的进程表中,因为他们不能递送给进程,所以状态是未决的(pending). 利用sigpending函数 ...
- Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段
该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能: ping一个网段内的IP,检测哪 ...
- Linux系统编程——进程间通信:信号中断处理
什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...
- Linux网络编程学习(五) ----- 信号(第四章)
1.基本概念 进程阻塞: 进程执行条件得不到满足,就自动放弃CPU资源而进入休眠状态,以等待条件满足,当条件满足时,系统就将控制权还给该进程进行未完成的操作 共享资源: 进程间协调使用的系统资源 锁定 ...
- Linux系统编程之----》信号
"===信号========================================================================================= ...
- linux 进程学习笔记-进程信号sigal
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...
- Linux Linux程序练习十三(信号阻塞,捕获)
/* * 题目: * 请编写一个程序,设置SIGINT和SIGQUIT信号, * 并在该程序中实现从文件中读取信息的操作, * 并保证在读取文件且只有在读取文件的过程中不会被发送的SIGINT和SIG ...
- [linux] C语言Linux系统编程-捕获进程信号
typedef void( *sighandler_t)(int); 1.用typedef给类型起一个别名. 2.为函数指针类型定义别名, 3.函数指针(指向函数的指针) sighandler_t s ...
随机推荐
- webForm TO MVC
- REACT Missing “key” prop for element
https://stackoverflow.com/questions/48266018/missing-key-prop-for-element-reactjs-and-typescript Whe ...
- STL 小白学习(2) string
#include <iostream> using namespace std; #include <string> //初始化操作 void test01() { //初始化 ...
- js中的setTimeout第三个参数
setTimeout跟setInterval大家应该都很熟悉的,但是一直很少注意,原来这两个函数可以支持第三个参数的,但是IE就呵呵了,仅IE(6-9)呵呵了,其他浏览器都支持的。 第三个参数将作为回 ...
- react+classnames
之前做项目的时候一直不知道有不知道有classnames这个东西,一直用的都是字符串拼接,感觉用的很别扭. classnames用法和angular1.x及vue差不多,所以用起来会比较顺手 1)安装 ...
- kaptcha验证码插件使用与参数
kaptcha使用1 kaptcha使用2 kaptcha使用3 kaptcha参数说明
- [Codeforces477D]Dreamoon and Binary
Problem 给定一个字符串数的二进制表示(不含前导0)s(长度不超过5000), 对于一个数n(初值为0),可以进行以下两种操作: 1.将n的二进制表示(无前导0)写到已经写的串的后面. 2.n加 ...
- L333 Should You Listen to Music While You Work?
Should You Listen to Music While You Work? "Whistle while you work" is classic advice, str ...
- 剑指Offer 27. 字符串的排列 (字符串)
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 自动化测试-15.selenium单选框与复选框状态判断
本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...