Linux信号那些事儿:探究操作系统中的信号机制

它可以选择忽略该信号、执行默认操作或者通过注册处理函数来进行自定义处理。可以使用kill()系统调用来向给定PID的Linux进程发送信号。在程序中可以注册自定义处理函数来响应某些或所有类型的信号。

在Linux系统中,信号(signal)是一种进程间通信机制,用于向进程发送异步事件。当一个进程接收到一个信号时,它可以选择忽略该信号、执行默认操作或者通过注册处理函数来进行自定义处理。

本文将深入探究Linux中的信号机制,包括常见的几十个标准信号、如何发送和接收信号、如何处理和阻塞不同类型的信号等方面。

什么是Linux中的标准信号?

在Linux系统中,有许多不同类型的标准信号。其中最常见且最重要的八个标准化UNIX/POSIX规范为SIGINT(2)、SIGQUIT(3)、SIGTERM(15)、SIGHUP(1)、SIGKILL(9)、SIGSTOP(19)以及 SIGCONT (18)。这些标准化UNIX/POSIX规范具有以下含义:

– SIGINT: 该命令可以使程序从键盘输入终止运行。

– SIGQUIT: 该命令也可以从键盘输入终止运行,并生成核心转储(core dump)文件。

– SIGTERM:该命令会请求程序正常退出,并允许它做完清理工作并保存状态。

– SIGHUP:当与当前终端断开连接时,该命令将发送给进程。

– SIGKILL:该命令强制终止进程,并不允许进行清理工作或保存状态。

– SIGSTOP:该命令停止一个进程的执行,并使其无法恢复运行。

– SIGCONT: 该命令从停止状态恢复一个被暂停的进程。

如何向Linux进程发送信号?

可以使用kill()系统调用来向给定PID的Linux进程发送信号。这个函数有两个参数,第一个是要接收信号的PID,第二个是要发送的信号类型。例如,为了向名为myprocess的程序发送SIGTERM信号:

“`

killall -15 myprocess

如何在Linux中接收和处理信号?

当一个程序启动时,默认情况下会忽略所有标准化UNIX/POSIX规范之外的所有信号。但是,在程序中可以注册自定义处理函数来响应某些或所有类型的信号。

首先需要使用signal()系统调用注册自定义处理函数。这里有三个参数:第一个参数是要设置处理器函数(也称为回调函数),第二个参数指定要注册处理器函数到哪种类型(或多种类型) 的SIGINT、SIGQUIT等标准化UNIX/POSIX规范之外 的非标准化和实时事件中, 第三个选项通常被设置为0。

例如,在C/C++语言中,可以使用以下代码来注册一个自定义信号处理函数:

#include

#include

Linux信号那些事儿:探究操作系统中的信号机制

#include

void my_handler(int signum) {

printf(“Received signal %dn”, signum);

}

int main() {

signal(SIGINT, my_handler); // 注册SIGINT信号的自定义处理函数

while(1) { sleep(1); } // 等待信号到达

当程序运行时,它将进入while循环,等待来自操作系统的信号。在这个例子中,如果程序接收到SIGINT(例如通过键盘输入CTRL + C),它将调用my_handler()函数并打印出“Received signal 2”的消息。

如何阻塞和解除阻塞Linux中的不同类型的信号?

有时候需要暂停某些或所有类型的信号,以便更好地控制程序执行流程。此时可以使用sigprocmask()系统调用。

该函数有三个参数:第一个参数指定要修改哪些标记;第二个参数指定对于这些标记是要进行添加、删除还是替换操作;第三个参数是一个指向sigset_t结构体变量的指针,在其中设置需要添加或删除/替换的具体标记。例如:

sigset_t new_mask;

sigemptyset(&new_mask);

sigaddset(&new_mask, SIGUSR1); // 添加SIGUSR1标志

// 阻塞所有标准化UNIX/POSIX规范之外的信号

sigprocmask(SIG_BLOCK, &new_mask, NULL);

在这个例子中,我们首先定义一个新的空信号集,并使用sigaddset()函数将SIGUSR1标记添加到该集合中。然后,我们使用sigprocmask()函数阻止所有标准化UNIX/POSIX规范之外的信号(包括SIGUSR1)。

如果需要解除某些或所有类型的信号,则可以使用相同的方法,只是在第二个参数中设置为SIG_UNBLOCK。

Linux系统中的信号机制是进程间通讯机制之一。本文介绍了Linux系统中常见的标准化UNIX/POSIX规范以及如何发送、接收、处理和阻塞不同类型的信号。希望本文对您有所帮助!