简介

  • Linux POSIX 详解

Linux POSIX 详解

在 Linux POSIX 系统中,<signal.h> 头文件用于处理信号(signals)。信号是一种异步通知机制,用于通知进程发生了特定的事件。

以下是关于 <signal.h> 头文件的详细解释:

功能

  • <signal.h> 头文件声明了与信号处理相关的函数和宏。
  • 它允许程序注册信号处理函数、发送信号以及处理由操作系统或其他进程发送的信号。

一些常见的信号

在 POSIX 系统中,有一些常见的信号及其含义如下:

  1. SIGINT:终端中断信号,通常由用户在终端按下 Ctrl+C 产生,用于终止正在运行的进程。

  2. SIGKILL:终止进程信号,用于强制终止进程,无法被捕获或忽略。

  3. SIGTERM:终止信号,通常用于请求进程自己优雅地终止运行。

  4. SIGSEGV:段错误信号,表示进程访问了无效的内存地址,通常是因为内存访问越界或者操作未分配的内存导致。

  5. SIGUSR1SIGUSR2:用户自定义信号。

信号处理函数

  • 使用 signal() 函数来注册信号处理函数,语法如下:
    1
    
      void (*signal(int signum, void (*handler)(int)))(int);
    

    这个函数用于设置 signum 信号的处理函数为 handler,当收到信号时执行该处理函数。

示例用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sigint_handler(int signum) {
    printf("接收到 SIGINT 信号,按下 Ctrl+C。\n");
    exit(signum);
}

int main() {
    signal(SIGINT, sigint_handler); // 注册 SIGINT 信号的处理函数

    printf("按下 Ctrl+C 终止程序...\n");

    while(1) {
        // 进程保持运行
    }

    return 0;
}

注意事项

  • 信号处理函数需要快速执行,不要包含太多耗时操作。
  • 信号是异步事件,可以在任何时候发生。因此,处理信号的时候需要小心并确保安全性。

<signal.h> 头文件允许程序员处理信号,以响应进程发生的特定事件。通过信号处理,程序可以捕获并处理异步发生的事件,使得程序具有更好的鲁棒性和可靠性。

Linux POSIX signal() 详解

在 Linux POSIX 系统中,<signal.h> 头文件中的 signal() 函数用于设置信号的处理函数。

以下是关于 signal() 函数的详细解释:

函数原型

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

参数

  • signum:表示要处理的信号的编号。它可以是预定义的信号常量,如 SIGINTSIGTERM 等。
  • handler:是一个函数指针,表示要与 signum 信号相关联的处理函数。可以是自定义的函数指针,用于处理接收到的信号。

返回值

  • signal() 函数返回一个函数指针,表示之前与 signum 相关联的信号处理函数。如果之前没有设置过信号处理函数,则返回 SIG_ERR

示例用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <signal.h>

void sigint_handler(int signum) {
    printf("接收到 SIGINT 信号,按下 Ctrl+C。\n");
}

int main() {
    // 注册 SIGINT 信号的处理函数
    signal(SIGINT, sigint_handler);

    printf("按下 Ctrl+C 终止程序...\n");

    while(1) {
        // 进程保持运行
    }

    return 0;
}

注意事项

  • signal() 函数用于设置对指定信号的处理方式。
  • 可以设置 SIG_IGN 来忽略某个信号,或者设置 SIG_DFL 恢复该信号的默认处理方式。
  • 调用 signal() 函数设置信号处理函数后,一旦接收到相应信号,就会调用注册的信号处理函数。

signal() 函数允许程序员为指定的信号设置自定义的处理函数,从而可以在程序中对接收到的信号做出相应的响应和处理。