Loading

linux:信号

信号的简介

信号(signal):在 Linux 系统中,信号是一种进程间通信(IPC)的机制,主要用于通知进程发生了某些异常或特殊情况。信号可以由硬件异常(如除零错误)、软件异常(如非法内存访问)或来自其他进程的通知(如终止请求)触发。Linux 支持多种信号,每种信号都有其特定的用途和默认行为。

  • 信号的类型

linux中有哪些信号,可以通过kill命令查询:

信号名称可以用数字表示,例如图中数字就一一对应了信号名称。在linux中,当程序接受到信号后,可以对信号进行捕捉,不同的信号有对应处理逻辑。

仅仅列举了常用信号,其他信号暂不做说明。

名称 编号 备注
SIGINT 2 程序终止(interrupt)信号, 通常是Ctrl+C时发出
SIGKILL 9 用来立即结束程序的运行. 本信号不能被阻塞、被处理、被忽略
SIGUSR1 10 留给用户使用
SIGUSR2 12 留给用户使用
SIGTERM 15 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.
SIGSTOP 19 停止(stopped)进程的执行;本信号不能被阻塞、被处理、被忽略
  • 信号的产生

程序在terminal执行中,常常通过ctrl+c来强制结束程序;如果程序在后台执行,常常通过kill命令杀死制定程序的pid。这就是信号产生的两种方式(硬件中断和软件中断)

验证各种信号

timer.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <signal.h>

static void signal_handler(int signum)
{
    switch (signum)
    {
    case SIGINT:
        printf("SIGINT: %d\n", signum);
        break;
    case SIGUSR1:
        printf("SIGUER1: %d\n", signum);
        break;
    case SIGUSR2:
        printf("SIGUER2: %d\n", signum);
        break;
    case SIGTERM:
        printf("SIGTERM: %d\n", signum);
        break;
    default:
        break;
    }
}

int main(int argc, char *argv[])
{
    signal(SIGINT, signal_handler);
    signal(SIGUSR1, signal_handler);
    signal(SIGUSR2, signal_handler);
    signal(SIGTERM, signal_handler);

    while (g_main_run)
    {
        sleep(1);
    }
    printf("exit...\n");

    return 0;
}

结果:

第一个终端:

第二个终端:

posted @ 2024-07-14 16:52  eiSouthBoy  阅读(30)  评论(0)    收藏  举报