linux进程间通信-----信号总结
来源:互联网 发布:维棠下载软件 编辑:程序博客网 时间:2024/06/06 19:49
相关文章:
linux信号的阻塞和未决
linux中sleep详解实例
废话不说,先把所有的信号列出来(注意里面没有32, 33信号),敲命令 kill -l
还有一个命令 man 7 signal 来查看信号的默认行为
后32个信号表示实时信号,是可靠信号,这保证了发送的多个实时信号都被接收;
实时信号都支持排队,都是可靠信号;非实时信号都不支持排队,都是不可靠信号;
#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);signal是注册信号的函数,当注册了该信号的行为后,那么进程收到该信号会执行设置好的行为;
参数handler还可以指定两个特殊的值;SIG_IGN是屏蔽该信号;SIG_DFL是恢复默认行为,SIGINT的默认行为是进程退出;
#include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);发送信号的函数,可以向进程ID为pid的进程发送sig信号;也可以向自身发送信号;
实例1:进程注册了SIGINT和SIGQUIT信号的处理函数;
SIGINT的值为2,SIGQUIT的值为3;按下Ctrl+c产生SIGINT信号,按下Ctrl+\产生SIGQUIT信号;
/*************************************************************************> File Name: int_quit_signal.cpp> Author: > Mail: > Created Time: 2015年12月16日 星期三 21时48分22秒 ************************************************************************/#include <iostream>#include <signal.h>#include <cstdlib>#include <unistd.h>using namespace std;void handler(int num){ cout << "\nrecvive the signal is " << num << endl; if(num == SIGQUIT){ cout << "recevie the exit signal..." << endl; exit(0); }}int main(int argc, char *argv[]){ //注册中断信号SIGINT signal(SIGINT, handler); signal(SIGQUIT, handler); cout << "main process is waiting for the signal of SIGINT and SIGQUIT..." << endl; while(1){ pause(); } cout << "main process exit.." << endl; exit(0);}
实例2:进程执行的前10秒是屏蔽了SIGINT信号,所以当产生SIGINT信号的时候进程不处理直接忽略;10秒过后就恢复默认行为,当产生SIGINT信号的时候进程直接退出;
/*************************************************************************> File Name: int_quit_signal.cpp> Author: > Mail: > Created Time: 2015年12月16日 星期三 21时48分22秒 ************************************************************************/#include <iostream>#include <signal.h>#include <cstdlib>#include <unistd.h>using namespace std;int main(int argc, char *argv[]){ //注册中断信号SIGINT signal(SIGINT, SIG_IGN); cout << "main process is sleeping(10s)...." << endl; sleep(10); cout << "\nthe signal has the default action and waiting the SIGITN to quit..." << endl; signal(SIGINT, SIG_DFL); sleep(100); cout << "main process exit.." << endl; exit(0);}
实例3:在这个例子中要使用kill来发送信号;程序的内容是,在父进程中注册SIGINT信号的信号处理函数,在子进程中每个2秒钟就向父进程发送一个SIGINT信号;
关于子进程中的每2秒发送一个信号,可以简单的使用while循环加上slepp(2)来实现;我这里使用alarm函数来实现,
该函数设置一个闹钟延迟发送信号告诉linux内核n秒中以后,发送SIGALRM信号;所以我在子进程安装对SIGALRM的信号处理函数,并在该信号处理函数中再调用alarm函数;
/*************************************************************************> File Name: int_quit_signal.cpp> Author: > Mail: > Created Time: 2015年12月16日 星期三 21时48分22秒 ************************************************************************/#include <iostream>#include <signal.h>#include <cstdlib>#include <unistd.h>using namespace std;void handler(int num){ cout << "parent recvive the signal is " << num << endl; if(num == SIGQUIT){ cout << "parent receive the signal of quit.." << endl; exit(0); }}void child_handler(int num){ cout << "child receive the signal is " << num << endl; if(num == SIGQUIT){ cout << "child receive the signal of quit.." << endl; exit(0); } kill(getppid(), SIGINT);//向父进程发送信号 alarm(2);}int main(int argc, char *argv[]){ //注册中断信号SIGINT signal(SIGINT, handler); signal(SIGQUIT, handler); pid_t pid = fork(); if(pid < 0){ cout << "fork error..." << endl; exit(-1); } if(pid == 0){ signal(SIGALRM, child_handler); signal(SIGQUIT, child_handler); alarm(2); cout << "this is child process..." << endl; while(1){ pause(); } exit(0); } cout << "main process is waiting for the signal of SIGINT and SIGQUIT..." << endl; while(1){ pause(); } cout << "main process exit.." << endl; exit(0);}
值得注意的是,最后从键盘发送了一个SIGQUIT信号,但是两个进程(父子进程)都收到了该信号;如果没有在子进程中安装该信号,那么父进程会连续收到两个SIGQUIT信号;
0 0
- linux进程间通信-----信号总结
- Linux 进程间通信 信号
- linux进程间通信--信号
- Linux进程间通信--信号
- Linux进程间通信 -- 信号
- Linux进程间通信-信号
- Linux进程间信号通信
- Linux 进程间通信 --- 信号通信 --- signal
- linux进程间通信-信号通信
- linux进程间通信-信号通信
- 唯快不破:Linux 进程间通信 --- 信号通信
- Linux进程通信--信号
- linux 进程信号通信
- linux 进程信号通信
- linux进程通信---信号
- linux进程通信-信号
- Linux环境进程间通信 信号
- Linux环境进程间通信 信号
- MPAndroidChart 教程:图表的具体设置 Specific chart settings(六)
- [javase学习笔记]-6.2 类与对象的关系
- 对关系模式的分解的认识
- 多线程总结2
- 高效开发iOS系列 -- 让Xcode的控制台支持LLDB类型的打印
- linux进程间通信-----信号总结
- C++中mutable关键的学习
- 对NodeJS的简单测试
- Linux kernel -页高速缓存和页回写 初探
- JSP复习(一) 基础
- 兼容性问题
- 插件XAlign的使用
- 带滑动条的导航栏(下)---修复浏览器变窄后导航栏变成两条的BUG
- 比较时间和日期大小