linux 信号机制的例子,分析程序,了解 kill() 函数的使用,信号的捕获相关问题

代码分析

  程序分析

void (*signal(int signum, void (*handler)(int)))(int);

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void my_func(int sign_no)
{
        if (sign_no == SIGINT)
        {
                printf("I have get SIGINT\n");
                //该信号在用户键入INTR字符(通常是ctrl+c)时发出
        }
        else if (sign_no == SIGQUIT)
        {
                printf("I have get SIGQUIT\n");
                //该信号和SIGINT类似,但右quit字符(通常是ctrl+\)来控制
        }
        sleep(10);
}

int main()
{
        printf("Waiting for signal SIGINT or SIGQUIT...\n");
        signal(SIGINT, my_func);
        signal(SIGQUIT, my_func);
        //这里第二个参数是自定义的信号处理函数指针(也可以是SIG_IGN:忽略该信号,SIG_DFL:采用系统默认的方式处理信号)
        signal(SIGKILL, my_func);
        signal(SIGSTOP, my_func);
        //SIGKILL与SIGSTOP信号不能被捕获和忽略
        signal(SIGUSR1, SIG_IGN);
        //这里第二个参数是 SIG_IGN:忽略该信号
        signal(SIGUSR2, SIG_DFL);
        //这里第二个参数是 SIG_DFL:采用系统默认的方式处理信号)
        kill(getpid(), SIGINT);
        while (1);
        exit(0);
}

  note:用kill命令向一个进程发送信号,语法是“kill 信号标识 进程ID

执行结果

执行结果