当前位置: 首页 > news >正文

【IPC 通信】信号处理接口 Signal API(5)

           收发信号思想是 Linux 程序设计特性之一,一个信号可以认为是一种软中断,通过用来向进程通知异步事件。

        本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解信号编程。


kill(2)

遵循 POSIX.1 - 2008

1.库

标准 c 库,libc, -lc

2.接口定义

        这个接口依 _POSIX_C_SOURCE 特性测试宏。

       #include <signal.h>int kill(pid_t pid, int sig);

3.接口描述

        kill() 系统调用可以用来向任何进程组或者进程发送任何信号。

        如果 pid 是正值,那么信号 sig 是发送给 pid 指定的进程。

        如果 pid 是 0,信号 sig 是发送给调用进程所在进程组的所有进程。

        如果 pid 是 -1,那么信号 sig 会发送给所有调用进程具有发送权限的进程,除了 1 号进程(init),具体下面会讨论。

        如果 pid 小于 -1,那么信号 sig 会发送给 -pid 指定进程的进程组里所有的进程。

        如果 sig 是 0,那么不会发送任何信号,但是仍然会进行进程是否存在和是否有权限等相关检查,这个就可以用来检查是否存在允许调用者发送信号的进程 ID 或者进程组 ID 存在。

        对于一个具有发送信号权限的进程来说,它要么是特权的(Linux 下需要具有目标进程用户名字空间的 CAP_KILL 能力),要么发送进程的真实或者有效的用户 ID 和目标进程的真实或者保存的 set-user-ID 相同。对于 SIGCONT 信号,发送和接收进程属于同一会话即可。(一些历史版本的规则可能不太一样,可以参考注意章节。)

4.返回值

        一旦成功(至少有一个信号发送出去了),就会返回 0。失败时,会返回 -1,具体错误信息通过 errno 来指示。

        错误代码如下:

EINVAL指定的信号不可用
EPERM调用进程没有向目标进程组任何进程发送信号的权限
ESRCH目标进程或者进程组不存在。注意:一个存在的进程可能是一个僵尸,即已经被终止执行(terminated)但是还没有 wait(2) 等待

5.历史

        在不同的 Linux 内核版本上,Linux 对非特权进程向其他进程发送信号实施了不同的策略。在 Linux 1.0 到 1.2.2 中,如果发送进程的有效用户 ID 和目标的有效用户 ID 匹配或者它们的真实 ID 匹配,那么就可以发送信号 。在 Linux 1.2.3 到 1.3.77,只要发送进程的有效用户 ID 和目标进程的有效或者真实 ID 匹配就可以发送信号。目前的策略是遵循 POSIX.1,并且在 Linux 1.3.78 中引入。

 6.注意

        对于 init 进程,也就是 1 号进程,只能向它发送它明确安装了信号处理函数的信号。这样做是为了保证系统不被偶然情况宕机。

        POSIX.1 要求 kill(-1,sig) 向调用者所有能发送的进程发送信号,除了一些实现定义的系统进程。Linux 允许进程向自己发送信号,但是 kill(-1,sig) 不会向调用进程发送。

        POSIX.1 要求如果进程向自己发送信号,如果发送线程没有阻塞信号,并且其他线程阻塞了该信号或者没有通过 sigwait(3) 等待该信号,那么在 kill() 返回前至少要向发送线程发生一个非阻塞信号。

7.BUGS

        Linux 2.6 后一直到 2.6.7,该接口一直存在一个 bug:在向进程组进程发送信号时,只要进程里有哪个进程没有权限发送信号,接口就会返回 EPERM。即使返回这个错误,信号还是发送给了有权限发送的进程了。

8.代码

        下面是一个父进程通过 kill() 杀死子进程的例子。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>int main(void){pid_t retVal;retVal = fork();if(retVal > 0){int i = 0;while(i++ < 5){printf("in the parent process.\n");sleep(1);}//kill the child processkill(retVal, SIGKILL);} else if (retVal == 0){int i = 0;//will not ever get to 15, because//the parent process will kill itwhile(i++ < 15){printf("In the child process.\n");sleep(1);}} else {//something bad happened.printf("Something bad happened.");exit(EXIT_FAILURE);}return 0;}

 

tkill(2)

遵循 Linux

1.库

标准 c 库,libc, -lc

2.接口定义

       #include <signal.h>           /* Definition of SIG* constants */#include <sys/syscall.h>      /* Definition of SYS_* constants */#include <unistd.h>[[deprecated]] int syscall(SYS_tkill, pid_t tid, int sig);#include <signal.h>int tgkill(pid_t tgid, pid_t tid, int sig);Note: glibc provides no wrapper for tkill(), necessitating theuse of syscall(2).

3.接口描述

        tgkill() 向线程组 tgid 中的线程 tid 发送信号 sig。(相反,kill(2) 只能用来向进程(线程组)发送信号,信号会被发送给进程中的任意线程。)

        tkill() 是 tgkill() 的过时版本。它只允许指定目标线程 ID,这会导致线程 ID 回收重新分配时信号发送到错误的线程。尽量避免使用这个系统调用。

        这些都是原始系统调用接口,只能被线程库内部使用。

4.返回值

        一旦成功,就会返回 0。失败时,会返回 -1,具体错误信息通过 errno 来指示。

        错误代码如下:

EAGAINsig 是实时信号并且达到了 RLIMIT_SIGPENDING 资源限制
EAGAINsig 是一个实时信号,并且内核内存不足
EINVAL线程 ID、线程组 ID或者信号 不合法
EPERM权限拒绝。对于需要的权限,参考 kill(2)
ESRCH指定的进程不存在

5.历史

        tkill()         Linux 2.4.19/2.5.4

        tgkill()        Linux 2.5.75,glibc 2.30

 6.注意

       对于进程组的解释,可以参考 clone(2) 的CLONE_THREAD 描述。

 

相关文章:

【IPC 通信】信号处理接口 Signal API(5)

收发信号思想是 Linux 程序设计特性之一&#xff0c;一个信号可以认为是一种软中断&#xff0c;通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解信号编程。 kill(2) 遵循 POSIX.1 - 2008 1.库 …...

Arduino PLC IDE

Arduino PLC IDE MCU单片机进入全新的PLC领域概述需要的硬件和软件下一步操作1. Arduino PLC IDE Tool Setup2. Arduino PLC IDE Setup3. Project Setup4. Download the Runtime5. Connect to the Device6. License Activation with Product Key (Portenta Machine Control) 结…...

记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章

一、前言 项目以前签字都是由C端那边进行合成操作&#xff0c;最近项目要求把那块功能&#xff0c;由后端进行实现&#xff0c;其中包含坐标、关键字、任意位置进行签字操作&#xff0c;坐标是最容易实现的&#xff0c;曾经也写过类似的功能在&#xff08;添加图片印章到PDF&a…...

Java8实战-总结37

Java8实战-总结37 默认方法不断演进的 API初始版本的 API第二版 API 默认方法 传统上&#xff0c;Java程序的接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每个方法提供一个实现&#xff0c;或者从父类中继承它的实现。但是&#xff0c;一旦类库…...

【超详细】前段开发之详细的Vue3入门教程,特别适合小白系统学习,入门到熟练使用Vue看这一篇就够了!

前言&#xff1a; 这篇文章更加侧重的是Vue3不同于Vue2的知识点&#xff0c;如果学习Vue2请看下面这篇文章 Vue2详细系统入门教程 11.2 Vue3 声明&#xff1a;图片资源来自于黑马程序员公开学习资料 本人在学习当中&#xff0c;详细整理了笔记&#xff0c;供大家参考学习 1…...

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…...

Python 同、异步HTTP客户端封装:性能与简洁性的较量

一、前言 引入异步编程趋势&#xff1a;Python的异步编程正变得越来越流行。在过去&#xff0c;同步的HTTP请求已经不足以满足对性能的要求。异步HTTP客户端库的流行&#xff1a;目前&#xff0c;有许多第三方库已经实现了异步HTTP客户端&#xff0c;如aiohttp和httpx等。然而…...

无代码赋能数字化,云表搭桥铺路链接“数据孤岛”

什么是信息孤岛 企业数字化转型过程中&#xff0c;信息孤岛是一个突出的问题。这种情况发生的原因是&#xff0c;企业内部使用了多种应用软件&#xff0c;时间一长&#xff0c;员工在不同的系统中积累了大量的企业数据资产。然而&#xff0c;由于这些系统之间的数据无法互通&am…...

无需公网IP,实现公网SSH远程登录MacOS【内网穿透】

目录 前言 1. macOS打开远程登录 2. 局域网内测试ssh远程 3. 公网ssh远程连接macOS 3.1 macOS安装配置cpolar 3.2 获取ssh隧道公网地址 3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址 4.1 保留一个固定TCP端口地址 4.2 配置固定TCP端口地址 5. 使用固定TCP端…...

网络爬虫学习笔记 1 HTTP基本原理

HTTP原理 ~~~~~ HTTP&#xff08;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种使用最为广泛的网络请求方式&#xff0c;常见于在浏览器输入一个地址。 1. URI和URL URL&#xff08;Universal Resource Locator&#xff0c;统一资源定位器&…...

113. 路径总和ii

力扣题目链接(opens new window) 给定一个二叉树和一个目标和&#xff0c;找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 在路径总和题目的基础上&…...

百度APP iOS端包体积50M优化实践(六)无用方法清理

一、前言 百度APP包体积经过一期优化&#xff0c;如无用资源清理&#xff0c;无用类下线&#xff0c;Xcode编译相关优化&#xff0c;体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP&#xff0c;业务迭代非常多…...

MySQL了解视图View (视图篇 一)

视图View是什么&#xff1f; MySQL的视图是一种虚拟表&#xff0c;它是基于一个或多个表的查询结果构建而成的。视图并不实际存储数据&#xff0c;而是根据定义的查询逻辑动态生成结果。 ----------------------------------- 视图的特点&#xff1a; - 虚拟表&#xff1a;…...

使用applescript自动化trilium的数学公式环境

众所周知&#xff0c;trilium什么都好&#xff0c;就是对数学公式的支持以及markdown格式的导入导出功能太拉了&#xff0c;而最拉的时刻当属把这两个功能结合起来的时候&#xff1a;导入markdown文件之后&#xff0c;原来的数学公式全没了&#xff0c;需要一个一个手动用ctrlm…...

idea中maven项目打包成jar,报错没有主清单属性解决方法

使用idea自带的打包可能会出现一下问题 在pom.xml中引入下面的依赖&#xff0c;即可解决 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions&…...

Caddy Web服务器深度解析与对比:Caddy vs. Nginx vs. Apache

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

基于PHP+MySQL的家教平台

摘要 设计和实现基于PHP的家教平台是一个复杂而令人兴奋的任务。这个项目旨在为学生、家长和教师提供一个便捷的在线学习和教授平台。本文摘要将概述这个项目的关键方面&#xff0c;包括用户管理、课程管理、支付处理、评价系统、通知系统和安全性。首先&#xff0c;我们将建立…...

吉利微型纯电,5 万元的快乐

熊猫骑士作为一款主打下层市场的迷你车型&#xff0c;吉利熊猫骑士剑指宝骏悦也&#xff0c;五菱宏光 MINI 等热门选手。 9 月 15 日&#xff0c;吉利熊猫骑士正式上市&#xff0c;售价为 5.39 万&#xff0c;限时优享价 4 .99 万元。价格和配置上对这个级别定位的战略车型有一…...

Gitee使用方法

Gitee是一个基于 Git 的代码托管和协作平台&#xff0c;具有免费、稳定等特点&#xff0c;并且能够与国内的Gitee社区、码云等服务相结合使用。 以下是使用Gitee的主要步骤&#xff1a; 注册账号&#xff1a;访问Gitee官网&#xff0c;点击“注册”按钮&#xff0c;填写注册信…...

前端适配笔记本缩放125%,150%导致页面错乱问题

由于前端在开发时使用的都是标准ui设计图&#xff0c;基本都是按照所以1920*1080&#xff0c; 而小屏幕笔记本由于分辨率高&#xff0c;所以导致的显示元素变小&#xff0c;因此很多笔记本的默认显示都是放大125%或者150%。 如果页面比较简单就让多余的空白单边扩展&#xff0c…...

语音转换技术全解析:从原理到实践的Retrieval-based Voice-Conversion-WebUI指南

语音转换技术全解析&#xff1a;从原理到实践的Retrieval-based Voice-Conversion-WebUI指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型&#xff01; 项目地址: https://gitcode.com/GitHub_Trending…...

【latex】探索LaTeX中加粗文本的多种方法及其在表格中的优化应用

1. LaTeX加粗文本的多种方法对比 第一次用LaTeX写论文时&#xff0c;我也以为\textbf{}是唯一的加粗方式。直到在表格里发现加粗后的文字会把单元格撑变形&#xff0c;才意识到LaTeX的文本修饰比想象中复杂得多。经过反复测试&#xff0c;我发现实际有5种常用加粗方法&#xf…...

NCM格式解密技术深度解析:如何实现网易云音乐无损音频转换

NCM格式解密技术深度解析&#xff1a;如何实现网易云音乐无损音频转换 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump ncmdump是一款专业的网易云音乐NCM格式解密工具&#xff0c;它通过Java实现完整的…...

GTX1060老显卡也能跑PyTorch!保姆级Win10+CUDA11.3+cudnn8.2环境配置避坑实录

GTX1060老显卡深度学习环境搭建全指南&#xff1a;从驱动优化到PyTorch实战 手里还握着五年前入手的GTX1060显卡&#xff1f;别急着让它退役。这套经典的Pascal架构显卡依然能在深度学习入门阶段大显身手。本文将带你完整走通Win10系统下的CUDA 11.3 cuDNN 8.2 PyTorch 1.11…...

AgentCPM深度研报助手C语言文件操作实战:批量处理本地研报文本文件

AgentCPM深度研报助手C语言文件操作实战&#xff1a;批量处理本地研报文本文件 你是不是也遇到过这样的场景&#xff1f;手头有一堆下载好的行业研报&#xff0c;有PDF&#xff0c;有TXT&#xff0c;堆在文件夹里。想快速了解每份报告的核心观点&#xff0c;但一份份打开看&am…...

OpenClaw+GLM-4.7-Flash低成本方案:自建模型替代SaaS API

OpenClawGLM-4.7-Flash低成本方案&#xff1a;自建模型替代SaaS API 1. 为什么选择自建模型替代商业API 去年夏天&#xff0c;当我第一次尝试用OpenClaw自动化处理公司周报时&#xff0c;被OpenAI的API账单吓了一跳——简单的文档整理和摘要生成&#xff0c;一个月竟然消耗了…...

无数据库版Mirror照妖镜源码解析:如何安全改造为个人图片鉴黄工具

无数据库版Mirror照妖镜源码解析&#xff1a;如何安全改造为个人图片鉴黄工具 在当今内容爆炸的时代&#xff0c;图片审核成为许多个人开发者和内容创作者的刚需。传统解决方案往往依赖复杂的数据库系统和第三方API&#xff0c;而Mirror照妖镜的无数据库设计为轻量级图片审核提…...

如何快速掌握React Email Editor:深入理解拖拽邮件编辑器的实现原理

如何快速掌握React Email Editor&#xff1a;深入理解拖拽邮件编辑器的实现原理 【免费下载链接】react-email-editor Drag-n-Drop Email Editor Component for React.js 项目地址: https://gitcode.com/gh_mirrors/re/react-email-editor React Email Editor是一个功能…...

嵌入式系统开发中的关键技术术语解析

嵌入式系统开发中的56个关键技术术语解析1. 数据转换基础概念1.1 采样与保持特性采集时间(Tacq)是从释放保持状态到采样电容电压稳定至新输入值的1 LSB范围之内所需的时间。在采样-保持电路中&#xff0c;这个参数直接影响系统的动态性能。孔径延迟(tAD)描述从时钟信号的采样沿…...

用Rust还是JavaScript?Tauri 2.0系统托盘开发的两种姿势与选型建议

Tauri 2.0系统托盘开发&#xff1a;Rust与JavaScript的技术选型深度解析 当桌面应用需要常驻后台运行时&#xff0c;系统托盘功能便成为用户体验的关键组件。Tauri 2.0作为新一代跨平台桌面框架&#xff0c;允许开发者在前端JavaScript与后端Rust两种技术栈中实现这一功能。本文…...