上一节中中简单介绍了信号的处理机制,就是调用函数库来实现信号的处理,因此,在这节中,介绍在C语言下如何理解信号的处理机制。
创建一个文件signal.c,文件内容如下:(对于学过一下C语言的童鞋来说是不是很熟悉呢)
#include<signal.h> //信号函数库
#include<unistd.h> //C和C++语言提供对POSIX
#include<stdio.h> //标准的输入输出库
void signalout(int signo) //自定义signalout函数,用于处理signal函数的参数
{
switch(signo)
{
case 1: //信号1SIGHUP
printf("Get a signal -- SIGHUP\n");
break;
case 2: //信号SIGINT
printf("Get a signal -- SIGINT\n");
break;
case 3: //信号SIGQUIT
printf("Get a signal -- SIGQUIT\n");
break;
default:
printf("error\n");
break;
}
}
int main()
{
printf("process ID is %d\n",getpid()); //调用unistd.h函数库中的getpid函数获取当前进程ID
signal(1,signalout); //写法有两种,一种是写信号数字
signal(SIGINT,signalout); //另一种写法是写信号名称
signal(SIGQUIT,signalout); //调用前面自定义的signalout函数处理信号
for(;;); //写一个死循环,目的是使这个进程一直在运行,以便捕捉信号
return 0;
}
题外讲解,signal()函数:
函数原型:
void (signal(int signum,void( handler)(int)))(int) 或 typedef void (*sig_t)( int ) 或 sig_t signal(int signum,sig_t handler)
参数说明:
第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号
第二个参数handler描述了与信号关联的动作,它可以取以下三种值:
(1)一个无返回值的函数地址
此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:
void func(int sig);
(2)SIG_IGN
这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。
(3)SIG_DFL
这个符号表示恢复系统对信号的默认处理。
保存编辑的文件后执行#gcc signal.c -o signal
,编译生成可执行二进制文件signal。(在这里我们就学习了如何在linux下进行C语言编写啦^_^)
接着我们运行二进制文件#./signal
在另外一个terminal中发送信号
目前按ctrl+c是无法终止当前进程的了。想要终止进程只能通过SIGKILL信号来实现(因为之前说过SIGKILL和SIGSTOP信号是无法被捕捉的嘛)#kill -9 22822
原文地址:http://blog.51cto.com/lythjq/2083083