进程同步(三)—— 信号
2016-05-02 13:40
357 查看
这些信号由系统定义,他们不是简单的int之类的数据类型,可能是调用一些函数。
这些信号中,10/12是给用户预留使用的,其他信号各有自己相应的含义。代码中无法完美的自定义信号,容易覆盖或产生系统错误,所以还是乖乖用系统提供的信号吧。
信号类似QT的信号槽的关系,一个信号对应一个处理函数,可以对相应的信号进行屏蔽之类的处理。
信号处理函数属于可重入函数,可以随时中断,允许多个副本执行。
信号处理属于异步处理,和主程是分开执行的,内核发送信号只发送一次。一般处理函数仅仅用于通知主程收到信号,有主程处理具体内容。
下面是信号处理代码,分别是内核发送的子进程结束信号和用户自定义信号。
#include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #include <string.h> #include <iostream> #include <stdlib.h> using namespace std; class sigOp { public: void addSigProcess(int sig,void (*func)(int)); void sendSig(const int sig, const int pid); }; void sigOp::addSigProcess(int sig,void (*func)(int)) { struct sigaction stuSig; memset(&stuSig, '\0', sizeof(stuSig)); stuSig.sa_handler = func; stuSig.sa_flags |= SA_RESTART; sigfillset(&stuSig.sa_mask); sigaction(sig, &stuSig, NULL); } void sigOp::sendSig(const int sig, const int pid) { kill(pid, sig); cout<<"send!"<<endl; } void recSig(int sig) { cout<<"rev sig!"<<endl; } void waitchlid(int sig) { pid_t pid; int stat; while((pid = waitpid(-1, &stat, WNOHANG)) > 0); } int main() { sigOp sig; sig.addSigProcess(SIGUSR1, recSig); sig.addSigProcess(SIGCHLD, waitchlid); pid_t pid = fork(); if (pid > 0) { sig.sendSig(SIGUSR1, pid); } else { return 0; } while(1); return 0; }
相关文章推荐
- Linux驱动开发之 三 (那些必须要了解的硬件知识 之 存储器篇)
- Linux netstat命令详解
- java中几种复制数组的方法比较
- 百度高级搜索技巧
- redis-list(列表)
- Linux开机自启配置
- sublime text快捷键
- Java本地文件操作(一)文件的创建、删除、重命名
- PySide学习笔记第十章-窗体小部件(widget)-下篇
- Linux编辑器vim键盘详解
- UVa 1593 Alignment of Code
- 啊哈!算法—火柴棍等式
- ansible之command和raw模块
- HDOJ 5676 ztr loves lucky numbers (贪心+数位DP)
- LR解决不能自动打开程序和不支持的浏览器的录制问题
- log4net 课一
- JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用
- Android图片的内存溢出问题
- [CDQ分治 并查集 || LCT] BZOJ 4025 二分图
- 215. Kth Largest Element in an Array