Linux中signal()函数详解

signal()函数:
这里写图片描述
第一个参数是要捕捉的信号(查看信号:kill -l,9号SIGKILL信号不能被捕捉);
第二个参数表示我们要对信号进行的处理方式。
信号的处理方式一般有三种:
(1)忽略此信号(SIG_IGN):

#include
#include
int main()
{
    signal(2,SIG_IGN);
    while(1)
    {
        printf("2333\n");
        sleep(1);
    }
    return 0;
}

当执行程序时,陷入死循环,此时按下Ctrl+c进程并不会停止,因为我们对Ctrl+c产生的2号SIGINT信号采取了忽略处理,若要停止进程可用Ctrl+\(SIGQUIT);
(2)执行该信号的默认处理动作(SIG_DFL):

#include
#include
int main()
{
    signal(2,SIG_DFL);
    while(1)
    {
        printf("2333\n");
        sleep(1);
    }
    return 0;
}

当执行程序时,同样是死循环,此时按下Ctrl+c进程停止,因为我们对2号信号采取默认动作处理,系统默认2号信号终止进程。
(3提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号:

#include
#include
void  handler(int signo)//自定义一个函数处理信号
{
    printf("catch a signal:%d\n:",signo);
}
int main()
{
    signal(2,handler);
    while(1)
    {
        printf("1111\n");
        sleep(1);
    }
    return 0;
}

当执行程序时,按下Ctrl+c,进程并不会停止,而是去执行自定义的函数handler(),若要停止,按下Ctrl+\。运行结果如图:
Linux中signal()函数详解_第1张图片
linux系统中的信号:(1-31,34-64)
Linux中signal()函数详解_第2张图片

你可能感兴趣的:(Linux)