当前位置: 首页 > 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…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...