上一节中中简单介绍了信号的处理机制,就是调用函数库来实现信号的处理,因此,在这节中,介绍在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语言编写啦^_^)
linux信号解释(4)--C语言下的理解

接着我们运行二进制文件#./signal
linux信号解释(4)--C语言下的理解

在另外一个terminal中发送信号
linux信号解释(4)--C语言下的理解
linux信号解释(4)--C语言下的理解

目前按ctrl+c是无法终止当前进程的了。想要终止进程只能通过SIGKILL信号来实现(因为之前说过SIGKILL和SIGSTOP信号是无法被捕捉的嘛)
#kill -9 22822
linux信号解释(4)--C语言下的理解