Linux C进程与多线程入门—(3)信号
来源:互联网 发布:网络诈骗事件汇总 编辑:程序博客网 时间:2024/06/08 13:53
本文出自http://www.wenbanana.com/?p=421稻草人博客,欢迎访问!
概念
信号是系统响应某些状况而产生的事件,进程在接受到信号时会采取相应的行动。信号可以明确地由一个进程产生发送到另外一个进程,用这种办法传递信息或协调操作行为。
进程可以生成信号、捕捉并相应信号或屏蔽信号。信号的名称是在头文件signal.h里定义。下面我列出一部分,如下:
---------------------------------------------------------------------------------
信号名称 说明
---------------------------------------------------------------------------------
SIGALRM 警告钟
SIGHUP 系统挂断
SIGINT 终端中断
SIGKILL 停止进程(此信号不能被忽略或捕获)
SIGPIPE 向没有读者的管道写数据
SIGQUIT 终端退出
SIGTERM 终止
---------------------------------------------------------------------------------
如果进程接收到上表中的某个信号但实现并没有安排捕捉它,进程就会立刻终止。
函数
实例1---处理SIGINT信号
#include <signal.h>#include <stdio.h>#include <unistd.h>void ouch(int sig){/*此处,signal(SIGINT, SIG_DFL),SIG_DFL表示 ouch函数捕获到SIGINT信号,作出输出信息处理之后,恢复了SIGINT的默认行为*/printf("OUCH! - I got signal %d\n", sig);(void) signal(SIGINT, SIG_DFL);}int main(){ (void) signal(SIGINT, ouch); while(1) { printf("Hello World!\n"); sleep(1); }}这个程序就是截获组合键Ctrl+C产生的SIGINT信号。没有信号出现时,它每隔一秒就会输出一个消息。第一次按下Ctrl+C产生的SIGINT信号,
实例2---模仿闹钟行为
函数1
函数2
#include <signal.h>#include <stdio.h>#include <unistd.h>static int alarm_fired = 0;void ding(int sig){ alarm_fired = 1;}int main(){ int pid; printf("闹钟程序已经启动\n"); /*子进程休眠5秒后向父进程发送SIGALARM信号,然后结束进程*/ if((pid = fork()) == 0) { sleep(5); kill(getppid(), SIGALRM); exit(0); } /*父进程执行的内容*/ printf("5秒后闹铃启动\n"); (void) signal(SIGALRM, ding); /*将运行的程序挂起,直到接收到信号为止*/ pause(); if (alarm_fired) printf("Ding!\n"); printf("done\n"); exit(0);}程序通过fork启动一个新进程,这个紫禁城休眠5秒后向 自己的父进程发送一个SIGALARM信号。父进程在安排好捕捉SIGALARM信号后暂停运行,直到接收到一个信号为止。
运行结果见下图:
- Linux C进程与多线程入门—(3)信号
- Linux C进程与多线程入门—(1)创建进程
- Linux C进程与多线程入门—(2)等待进程
- Linux C进程与多线程入门—(4)简单多线程程序
- Linux C语言程序设计(十五)——进程、线程与信号
- Linux C进程与多线程
- Linux C进程与多线程入门—(5)使用互斥量进行同步
- Linux 进程与信号
- Linux多线程与信号
- Linux多线程与信号
- Linux多线程与信号
- 尝试linux下c编程之进程与信号
- linux下c编程进程通信-管道与信号
- Linux程序设计--进程与信号
- linux 多线程与信号pthread_kill
- Linux进程与多线程
- linux进程间的通信(C):信号
- linux-C子进程退出信号
- Cmake参考
- 启动Tomcat报错:严重: Exception starting filter struts2 java.lang.NoClassDefFoundError: org/apache/commons/
- Dictionary中扩展方法的一个应用
- 链表合并
- MySQL在Linux下的安装注意,这里进行RPM包安装时需要切换到root用户下~
- Linux C进程与多线程入门—(3)信号
- 企业级别运维实战书籍
- GO - HelloWorld
- Eclipse中Cannot nest src folder解决方法
- Eclipse+CDT 头文件无法解析的问题( Ubuntu 11.10,Eclipse 3.7)
- 寒假刷题之1——以生态为名义的剥削
- 软件架构师不等同于资深程序员
- java中jsp,servlet,javabean
- 初识英特尔线程构建模块之内存管理tbb_malloc