在 Linux 中,信号(Signal)是一种进程间通信的机制,用于通知进程发生了某种事件。理解信号的来源对于开发可靠、健壮的程序至关重要。本文将介绍三种常见的信号产生方式,包括:kill 命令、键盘输入(如 Ctrl+C)、以及系统调用,并配上相关示例代码来帮助理解。

一、使用 kill 命令发送信号

kill 命令是最常见的发送信号方式,它通过向指定进程发送一个信号(默认是 SIGTERM,编号 15)来通知它终止或执行某些操作。

示例:

# 查看当前终端的 bash 进程号
$ echo $$
12345# 向该进程发送 SIGINT(中断信号,编号2)
$ kill -2 12345# 发送默认的 SIGTERM(终止信号)
$ kill 12345

kill -l 可以列出所有支持的信号及其编号;

kill -9 PID 发送 SIGKILL 信号,强制终止进程,不可被捕捉或忽略;

二、键盘输入产生的信号

键盘是最常见的交互方式,在终端中直接通过快捷键向前台进程发送信号。

常用快捷键及对应信号

快捷键信号名称信号编号含义
Ctrl + CSIGINT2中断进程
Ctrl + \SIGQUIT3退出进程并产生 core dump
Ctrl + ZSIGTSTP20暂停进程

示例代码(接收 SIGINT)

#include <signal.h>
#include <stdio.h>
#include <unistd.h>void handle(int sig) {printf("收到信号 SIGINT(%d),中断操作被捕获!\n", sig);
}int main() {signal(SIGINT, handle); // 注册信号处理器while (1) {printf("程序运行中,按 Ctrl+C 发送 SIGINT 信号...\n");sleep(1);}return 0;
}

运行上述程序后按 Ctrl+C,你会看到自定义的中断提示,而不是程序直接退出。

三、系统调用产生信号(编程方式)

可以通过系统调用函数 kill() 或 raise() 在程序内部主动发送信号。

1、kill():向其他进程或自己发送信号

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>void handle_usr1(int sig) {printf("子进程收到 SIGUSR1 信号!\n");
}int main() {pid_t pid = fork();if (pid < 0) {perror("fork 失败");exit(1);}if (pid == 0) {// 子进程signal(SIGUSR1, handle_usr1);printf("子进程 PID: %d,等待父进程发信号...\n", getpid());pause(); // 等待信号} else {// 父进程sleep(2); // 给子进程注册 handler 的时间printf("父进程向子进程(PID: %d)发送 SIGUSR1...\n", pid);kill(pid, SIGUSR1);wait(NULL); // 等待子进程退出}return 0;
}

2、 raise():向自己发送信号

#include <signal.h>
#include <stdio.h>void handle_usr1(int sig) {printf("收到 SIGUSR1 信号(%d)\n", sig);
}int main() {signal(SIGUSR1, handle_usr1); // 注册信号处理器raise(SIGUSR1); // 向自身发送信号return 0;
}

因此:
kill() 适合发送信号到任意进程(需要权限);

raise() 适合程序内部自我触发信号,例如模拟中断或测试处理器行为。

四、总结

方式说明适用场景
kill 命令通过命令行发送信号终端手动管理进程
键盘信号快捷键控制前台进程交互中断、终止
系统调用程序内部控制信号行为异常处理、调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86236.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86236.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86236.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android15启动icon界面的背景图颜色

Android15启动icon界面的背景图颜色 在一加Ace 5启动时有个图标在中间的&#xff0c;它界面的背景图是灰色的&#xff0c;不好看&#xff0c;想改为白色。 解决方案&#xff1a; 在app下的AndroidManifest.xml文件的<application这个标签的android:theme增加&#xff1a;…

用福昕阅读器打开pdf文件,整个程序窗口自动缩小的问题

原因&#xff1a; 这个问题&#xff0c;其实是pdf自带了某个缩放比例&#xff0c;与窗口的比例不一致&#xff0c;因此会进行窗口缩放。 解决方法: 用acrobat&#xff08;我没有找到如何用福昕阅读器进行设置的方法&#xff09;&#xff0c;打开【文档属性】&#xff0c;然后打…

Windows环境Browser-Use平台部署与AI自动化远程访问实现过程

文章目录 前言1. 安装Ollama2. Gemma3模型安装与运行3. 虚拟环境准备3.1 安装Python3.2. 安装conda 4. 本地部署Brower Use WebUI4.1 创建一个新conda环境4.2 克隆存储库4.3 安装依赖环境4.4 安装浏览器自动化工具4.5 修改配置信息 5. 本地运行测试6. 安装内网穿透6.1 配置公网…

React + Umi(Umijs/Max) 搭建项目及配置

文章标题 01 环境准备02 快速构建2.1 参数选项2.2 umix 还是 umijs/max2.3 使用 pnpm &#xff08;推荐&#xff09;2.4 使用 npm 和 yarn2.5 启动项目2.6 启用 Prettier&#xff08;可选&#xff09;2.7 打包部署发布 03 Tailwind CSS 插件&#xff08;可选&#xff09;3.1 安…

JDK 17 中 java.lang.System 常用方法及应用场景

概述 java.lang.System 在 JDK 17 中依然是最核心的系统交互类之一。以下是针对 JDK 17 的常用方法详解&#xff0c;包含新特性和最佳实践。 一、标准 I/O 流&#xff08;更新至 JDK 17&#xff09; 1. 控制台输出 // 传统输出方式&#xff08;仍然可用&#xff09; System…

深入探究Manticoresearch Java API:新增与查询文档实战

引言Java 项目集成 Manticoresearch新增文档操作查询文档操作 SQL 查询API 查询 总结 引言 Manticore Search 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search。它显著改进了 Sphinx 的功能&#xff0c;修复了数百个错误&am…

Linux远程机器无法连接-------解决方案

笔者这几天碰到linux机器远程ssh 无法连接的情况 背景分析 笔者在linux机器进行测试的时候&#xff0c;偶发突然无法连接机器&#xff0c;如下图所示&#xff0c;vscode的远程连接也无法进行。 telnet也无法登录。 解决方案 笔者的登录场景是这样的&#xff0c;所以怀疑是…

网络模型中,应用层支持什么协议

在网络模型中&#xff08;无论是 OSI 七层模型 还是 TCP/IP 四层模型&#xff09;&#xff0c;应用层 是最顶层&#xff0c;直接为用户或应用程序提供网络服务接口。它支持的是各种具体的应用程序协议&#xff0c;这些协议定义了特定类型应用程序如何进行通信和数据交换。 以下…

比特币序数理论与铭文的终极指南

引言&#xff1a;比特币网络的意外趋势 去年&#xff0c;比特币网络上出现了一个意外的趋势——这一趋势令许多比特币纯粹主义者感到愤怒和惊讶&#xff0c;但同时也在更广泛的加密货币社区中点燃了对这个行业最古老、最安全区块链的希望和热情。 这个趋势涉及铭文&#xff0…

C/C++ DLL 动态链接库的开发与示例详解

简介 介绍 QT6&#xff0c;DLL 动态链接库的开发&#xff0c;开发示例 详细 DLL 入口函数 DllMain 是每个 dll 的入口函数&#xff0c;可以写&#xff0c;也可以不写&#xff0c;不影响其他库函数运行。如果使用此函数需要包含头文件#include <objbase.h>。 BOOL WI…

在 CentOS 7 上基于 Docker 的 LNMP 部署 Hexo

时间起因是因为之前BLOG没有备份数据都丢失了,今天在和朋友聊天的时候讨论到到底使用Hexo还是用Halo?最后还是想熟悉下这两种博客的架设和部署方式,每次部署都有各种不同的问题,旨在提升自己的学习认知。以此有机会得到更多大佬们的指导~ 因为我是在 CentOS 7 服务器上使用…

《Go小技巧易错点100例》第三十六篇

本期分享&#xff1a; 1.使用gops获取正在运行的Go进程 2.将静态文件编译到Go程序中 3.Go语言通过多重赋值实现变量值交换 使用gops获取正在运行的Go进程 在 Go 语言开发中&#xff0c;进程诊断和性能分析是保障服务稳定性的关键环节。Google 开源的 gops [https://github.…

Idea新UI

轻松上手Idea新UI&#xff1a;开启高效编程新体验 在软件开发领域&#xff0c;IntelliJ IDEA一直以其强大的功能和出色的性能深受开发者喜爱。而其推出的new ui&#xff0c;更是为我们带来了全新的操作体验&#xff0c;进一步提升了开发效率。今天&#xff0c;就来详细讲讲如何…

QML\QtQuick\QtWidgets适合的场景及其优缺点

在Qt框架中&#xff0c;QML、QtQuick和QtWidgets是三种不同的UI开发技术&#xff0c;各有其适用场景和优缺点。以下是它们的对比分析&#xff1a; 1. QtWidgets 适用场景&#xff1a; 传统的桌面应用程序&#xff08;Windows/macOS/Linux&#xff09;。 需要复杂控件&#xf…

Spring Boot 2.x 项目搭建 (二)

因为Spring Boot 2.x 项目搭建 &#xff08;一&#xff09;访问 start.spring.io 或通过IDE&#xff08;如IntelliJ IDEA&#xff09;的Spring Initializr向导创建项目时&#xff0c;只能使用jdk17以上的版本&#xff0c;这里我需要兼容老项目需要JDK1.8&#xff0c;所以进行一…

Python 前端框架/工具合集

前言 Python 本身并不是为前端开发而设计的语言&#xff0c;但确实有一些 Python 框架可以“变相”地用于前端开发&#xff0c;比如生成 HTML、控制前端页面逻辑&#xff0c;甚至可以直接运行在浏览器中。 目标 本文将对常见的使用python实现的前端框架&#xff0c;先做一个…

Swagger 在 Spring Boot 中的详细使用指南

Swagger 是一个强大的 API 文档生成工具&#xff0c;在 Spring Boot 项目中主要通过 springdoc-openapi 库实现。下面我将详细讲解 Swagger 的配置、注解使用和高级功能。 一、基础配置 1. 添加依赖 在 pom.xml 中添加&#xff1a; xml 复制 下载 运行 <dependency&…

群晖如何开启及使用ssh:小白用户上手指南-家庭云计算专家

最近很多用户希望提供群晖下onlyoffice的安装服务,但是很多都是萌新小白,不知道怎么启用ssh和使用ssh客户端.这里提供简单的方法,统一答复: 重要的事情说3遍:一定不要自己发挥,全部按说明的来;一定要在内网环境用内网ip访问;不要用域名和端口号,谢谢各位萌新了!!! 一、ssh启用…

Ubuntu查看与切换显示管理器(已测试ubuntu20,ubuntu24)

一级标题 显示管理器是用户使用图形化的登录界面。 当用户成功输入用户名和密码后&#xff0c;即可开始使用图形化界面会话。gdm3和 lightdm 都是显示管理器。 它们提供了图形化登录并处理用户身份验证。 查看正在使用的显示管理器&#xff1a; cat /etc/X11/default-displa…

ROS 2 中 Astra Pro 相机与 YOLOv5 检测功能编译启动全记录

先记录大概主要流程&#xff0c;后期有时间了再完善细节以及附上截图 一、编译 Astra Pro 相机功能包 1. 清理并编译相机包 cd ~/Astra_ws rm -rf build/astra_camera install/astra_camera # 清理旧编译 colcon build --packages-select astra_camera --parallel-workers …