📜  C语言信号(1)

📅  最后修改于: 2023-12-03 14:40:27.858000             🧑  作者: Mango

C语言信号

在C语言中,信号是指软件中断,用于通知进程发生了某种特定事件。例如,当用户按下中断键(Ctrl+C)时,操作系统会向进程发送一个信号,告诉它需要终止。

信号的基本概念

每个信号都有一个唯一的编号(signal number),从1开始,但有两个例外:

  • 信号0没有特殊含义,但可以用于检测进程是否存在。
  • 信号1(SIGHUP)是一个特殊信号,当进程的控制终端关闭时发送。

对于每个信号,都有一个默认的行为(default action),即当进程接收到该信号时将采取的操作。常见的默认行为有:

  • 终止进程(terminate)
  • 忽略信号(ignore)
  • 抛出异常(raise an exception)
信号的处理

在C语言中,我们可以使用signal函数来处理信号。该函数的原型如下:

void (*signal(int sig, void (*func)(int)))(int);

其中,sig为信号编号,func为信号处理函数的地址。

信号处理函数的定义如下:

void func(int sig);

当进程接收到sig信号时,将调用func函数进行信号处理。在信号处理函数中,可以执行任意操作,但可能存在一些限制。例如,不要调用会阻塞的系统调用,否则可能导致死锁。

使用示例

以下是一个简单的示例,演示了如何使用C语言处理信号。在该示例中,我们使用signal函数注册了一个信号处理函数,每当进程接收到SIGINT信号时,就会执行该函数,并输出一条消息。

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

void sigint_handler(int sig)
{
    printf("Caught SIGINT, exiting...\n");
    exit(0);
}

int main()
{
    signal(SIGINT, sigint_handler);

    printf("Press Ctrl+C to terminate\n");
    while(1);

    return 0;
}

当运行该程序时,会输出一条提示信息,并等待用户按下中断键。当用户按下中断键时,程序将接收到SIGINT信号,调用sigint_handler函数进行处理,并退出程序。