C++SIGUSR1和SIGUSR2的学习
来源:互联网 发布:在数据库的增删改查 编辑:程序博客网 时间:2024/05/16 08:54
代码转载自:http://www.sharejs.com/codes/cpp/6846
http://www.cnblogs.com/chenyadong/archive/2011/10/11/2207985.html
本文仅作自己学习记录,不作它用!
(一)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 SIGUSR1n"); case SIGUSR2: //处理信号 SIGUSR2 printf("Child : catch SIGUSR2n"); default: //本例不支持 printf("Should not be heren"); break; }}int main(void){ pid_t ppid, cpid; //为两个信号设置信号处理函数 if(signal(SIGUSR1, handler) == SIG_ERR) { //设置出错 perror("Can't set handler for SIGUSR1"); exit(1); } if(signal(SIGUSR2, handler) == SIG_ERR) { //设置出错 perror("Can't set handler for SIGUSR2"); exit(1); } ppid = getpid();//得到父进程ID if((cpid = fork()) < 0) { perror("fail to fork"); exit(1); } else if(cpid == 0) { //子进程 if(kill(ppid, SIGUSR1) == -1) { perror("fail to send signal"); exit(1); } while(1);//死循环,等待父进程的信号 } else { sleep(1);//休眠,保证子进程先运行,并且发送SIGUSR1信号 if(kill(ppid, SIGUSR2) == -1) { perror("fail to send signal"); exit(1); } printf("kill childn");//输出提示 if(kill(ppid, SIGKILL) == -1) { //发送SIGKILL信号,杀死子进程 perror("fail to send signal"); exit(1); } if(wait(NULL) ==-1) { //回收子进程状态,避免僵尸进程 perror("fail to wait"); exit(1); } } return;}//该代码片段来自于: http://www.sharejs.com/codes/cpp/6846
(二)捕捉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 2581received SIGUSR1[chinsung@thinkpad apue]$ kill -USR2 2581received 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收到信号过后,按照约定(注册的信号处理函数)进行了相应的处理(打印进程信息)。
0 0
- C++SIGUSR1和SIGUSR2的学习
- APUE--捕捉SIGUSR1和SIGUSR2的简单程序
- Unix:用户自定义信号-SIGUSR1和SIGUSR2
- 捕捉SIGUSR1 SIGUSR2的简单程序
- C++实现的两个进程,父进程处理SIGUSR2,子进程处理SIGUSR1
- dce的异常和handle SIGUSR1 nostop
- 信号学习 SIGUSR1信号实现
- 捕获SIGUER1和SIGUSR2的简单程序 | 信号处理程序 | signal函数
- signal(SIGUSR1, SIG_IGN) 的意思
- rsync备份时报错rsync error: received SIGUSR1 or SIGINT (code 20) at rsync.c(229)
- SIGUSR1信号程序退出
- object-c学习 - object-c和c的布尔类型
- [C++]关于i++和++i的学习
- 一起学习VB和C的效率
- 简述C和C++的学习历程
- 简述C和C++的学习历程
- 简述C和C++的学习历程
- 简述C和C++的学习历程
- 【分享】ココロ@ファンクション!+NEO【日文硬盘版】[全CG存档&攻略+日本语启动&打开存档补丁]
- 【C++11】完美转发的使用
- OC语言之OC对象和方法
- 文章标题
- OC语言之封装,继承,多态
- C++SIGUSR1和SIGUSR2的学习
- poj--2236--Wireless Network(并查集)
- UITableView UITableViewCell UITableViewController
- 构建IoT系统必须的五项内容 (Page 1)
- ubuntu修改web根目录
- 鸡兔同笼问题
- 三消游戏核心逻辑的一种实现
- 业务流程节点信息构件
- Head First C (后半部分)读书笔记