Linux C进程与多线程入门—(3)信号
本文出自http://www.wenbanana.com/?p=421稻草人博客,欢迎访问!
概念信号是系统响应某些状况而产生的事件,进程在接受到信号时会采取相应的行动。信号可以明确地由一个进程产生发送到另外一个进程,用这种办法传递信息或协调操作行为。
进程可以生成信号、捕捉并相应信号或屏蔽信号。信号的名称是在头文件signal.h里定义。下面我列出一部分,如下:
---------------------------------------------
信号名称 说明
---------------------------------------------
SIGALRM 警告钟
SIGHUP 系统挂断
SIGINT 终端中断
SIGKILL 停止进程(此信号不能被忽略或捕获)
SIGPIPE 向没有读者的管道写数据
SIGQUIT 终端退出
SIGTERM 终止
---------------------------------------------
如果进程接收到上表中的某个信号但实现并没有安排捕捉它,进程就会立刻终止。
(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信号,程序会调用ouch函数,输出信息,同时,恢复SIGINT为默认行为(即按下Ctrl+C组合键后即结束运行),那么第二次按下Ctrl+C组合键时,程序就结束了运行。运行效果见下图:
实例2---模仿闹钟行为函数1#include <sys/types.h>#include <signal.h> int kill (pid_t pid, int sig);kill函数的作用是把sig信号发送给标识为pid的进程,成功时返回“0”,失败时返回“-1”. 要想发送一个信号,两个进程(发送和接受两方)必须拥有同样的用户ID,,就是说,你只能想自己的另一个进程发送信号。但是超级用户可以向任何进程发送信号。
函数2#include <unistd.h>unsigned int alarm (unsigned int seconds ) ;alarm函数是在seconds秒后安排发送一个SIGALARM信号。若seconds为0,表示将取消全部已经设置的闹钟请求。每一个进程只有一个可用的闹钟。它的返回值是前一个闹钟闹响之前还需经过的剩余秒数。调用失败则返回“-1”.
参考文献:Linux程序设计