概念:
信号是系统响应某些状况而产生的事件,进程在接受到信号时会采取相应的行动。信号可以明确的由一个进程产生发送到另外一个进程,用这种办法传递信息或协调操作行为。
进程可以生成信号,捕捉并相应信号或屏蔽信号。信号的名称是在头文件signal.h里定义。下面我列出一部分。
---------------------------------------------------------------------------------
信号名称 说明
---------------------------------------------------------------------------------
SIGALRM 警告钟
SIGHUP 系统挂断
SIGINT 终端中断
SIGKILL 停止进程(此信号不能被忽略或捕获)
SIGPIPE 向没有读者的管道写数据
SIGQUIT 终端退出
SIGTERM 终止
---------------------------------------------------------------------------------
函数:
#include<signal.h>
void (* signal(int sig,void (*func) (int )))(int );
这个函数看起来很复杂 , 但使用很简单。第一个参数sig 就是准备捕获或屏蔽的信号,接收到指定信号时将调用func函数处理。
实例1: 处理sigint信号
ctrlc.c 文件
-
#include <signal.h>
-
#include <stdio.h>
-
#include <unistd.h>
-
-
void ouch(int sig)
-
{<pre name="code" class="cpp"> /*此处,signal(SIGINT, SIG_DFL),SIG_DFL表示 ouch函数捕获到SIGINT信号,作出输出信息处理之后,恢复了SIGINT的默认行为*/</pre> printf("OUCH! - I got signal %d\n", sig);
-
<div><img src="file:///C:\users\banana\AppData\Tencent\Users\294299195\QQ\WinTemp\RichOle\}_J$7`I)~JBGVXP3]`BVX6U.jpg" alt=""></div>
-
(void) signal(SIGINT, SIG_DFL);}int main(){ (void) signal(SIGINT, ouch); while(1) { printf("Hello World!\n"); sleep(1); }}
-
<pre></pre>
-
这个程序就是截获组合键Ctrl+C产生的SIGINT信号。没有信号出现时,它每隔一秒就会输出一个消息。第一次按下Ctrl+C产生的SIGINT信号,
-
<pre></pre>
-
<pre></pre>
程序会调用ouch()函数,输出信息,同时,回复sigint为默认行为(即按下artc+c组合键即结束运行)
实例2:模仿闹钟行为
函数1:
#inlcude<sys/types.h>
#include<signal.h>
int kill (pid_t ,int sig);
kill 函数的作用是把sig信号发送给表示为pid的进程,成功时返回0.失败时返回-1,要想发送一个信号,两个进程(发送和接受)必须同样拥有用户id,就是说,你只能向自己的另一个进程发送信号,但是超级用户可以向任何进程发送信号。
函数2
#include <unistd.h>
unsigned int alarm (unsigned int seconds ) ;
alarm函数是在seconds秒后安排发送一个SIGALARM信号。若seconds为0,表示将取消全部已经设置的闹钟请求。每一个进程只有一个可用的闹钟。
它的返回值是前一个闹钟闹响之前还需经过的剩余秒数。调用失败则返回“-1”.
-
#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信号后暂停运行,直到接收到一个信号为止。
运行结果见下图: