Linux信号:进程间通讯与事件处理的基石

简介: 在Linux操作系统中通过信号,一个进程可以向另一个进程发送某种类型的通知,以便触发特定的动作。本文将深入探讨Linux信号的概念、种类、处理方式以及代码示例。

一、什么是信号?
信号是Linux中用于进程间通讯的基本机制,它是异步通知机制,即发送信号的进程无需等待接收信号的进程响应。信号常用于通知进程发生了某个事件,比如终止信号(SIGTERM)用于请求进程正常终止,中断信号(SIGINT)用于从终端键盘输入中断进程等。

二、常见信号及其含义:
Linux系统提供了多种信号,每个信号都有一个唯一的整数值用于标识,例如SIGINT表示中断信号。以下是一些常见信号及其含义:

SIGINT (2): 中断信号,通常由用户在终端输入Ctrl+C触发,用于请求进程终止运行。
SIGTERM (15): 终止信号,用于请求进程正常终止。
SIGKILL (9): 杀死信号,强制终止进程。
SIGUSR1 (10) 和 SIGUSR2 (12): 用户自定义信号,可由用户自行定义其含义。

三、信号处理方式:
Linux中的信号可以有三种处理方式:

忽略信号:进程可以通过将信号处理函数设置为SIG_IGN(即忽略)来忽略特定信号,通常对于一些不需要处理的信号使用这种方式。

捕捉信号:进程可以为特定信号注册信号处理函数,当接收到该信号时,系统会调用相应的处理函数进行处理。

默认处理方式:对于未显式处理的信号,系统将采用默认的处理方式。例如,SIGINT的默认处理方式是终止进程。

四、代码示例:
以下示例演示了如何在Linux中注册信号处理函数,并使用信号进行简单的进程间通讯。

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

// 信号处理函数
void signal_handler(int sig) {
   
    if (sig == SIGINT) {
   
        printf("Received SIGINT signal. Terminating.\n");
        // 进行清理工作或退出进程
        // ...
        _exit(0);
    } else if (sig == SIGUSR1) {
   
        printf("Received SIGUSR1 signal. Custom signal handler.\n");
        // 自定义信号处理动作
        // ...
    }
}

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

    printf("Process PID: %d\n", getpid());

    while (1) {
   
        // 进程主循环
        // ...
        sleep(1);
    }

    return 0;
}

运行以上代码,在终端中使用Ctrl+C发送SIGINT信号给进程,进程会响应SIGINT信号并调用信号处理函数进行终止操作。而使用kill命令或其他进程向该进程发送SIGUSR1信号时,进程会调用信号处理函数执行自定义操作。

结论:

Linux信号是进程间通讯与事件处理的基石。通过信号,不同进程可以实现异步通知,响应特定事件,以及执行自定义动作。合理使用信号可以实现进程间的协作与通讯,同时也需要注意信号处理函数的设计和信号处理过程中的同步与安全性,以确保系统的稳定运行。

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
13天前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
26 0
|
2月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
440 2
|
2月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
58 2
|
8天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
12 1
|
13天前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
16 0
Linux c/c++之IPC进程间通信
|
13天前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
15 0
Linux c/c++进程间通信(1)
|
13天前
|
Linux C++
Linux c/c++之进程的创建
这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。
17 0
Linux c/c++之进程的创建
|
18天前
|
iOS开发 MacOS
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
19 2
|
1月前
|
Linux Shell
6-9|linux查询现在运行的进程
6-9|linux查询现在运行的进程
|
13天前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
15 0