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

           收发信号思想是 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 描述。

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

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

相关文章

git权限不够:Ask a project Owner or Maintainer to create a default branch

新仓库还未创建任何分支时&#xff0c;Developer角色时首次提交代码&#xff0c;抛如下异常 remote: GitLab: remote: A default branch (e.g. master) does not yet exist for galaxy/apache-jspf-project remote: Ask a project Owner or Maintainer to cre…

leetcode做题笔记154. 寻找旋转排序数组中的最小值 II

已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,4]若旋转 7 次&#xff0…

使用光纤激光切割机等激光切割设备时的一些小诀窍

光纤激光切割机极大地提高了钣金加工行业切割效果和生产效率。然而在我们对客户的回访调查中&#xff0c;发现客户普遍存在着对光纤激光切割机设备的保养维护意识不足的问题&#xff0c;这严重影响了设备的正常使用和使用寿命。 虽然激光切割机有日常的保养&#xff0c;但是也需…

jvm垃圾收集算法

简介 由于《分代收集理论》和不同垃圾收集算法&#xff0c;Java堆应该被划分为不同区域&#xff0c;一般至少会把Java堆划分为新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;两个区域。 垃圾收集器可以只回收其中某一个或者…

力扣每日一题(+日常水几道题)

每日一题1333. 餐厅过滤器 - 力扣&#xff08;LeetCode&#xff09; 简单的按规则排序,去除几个不满足的条件然后排序返回即可 #include<algorithm> class Solution { public:vector<int> filterRestaurants(vector<vector<int>>& restaurants, …

侯捷 C++ STL标准库和泛型编程 —— 1 STL概述 + 2 OOPvsGP

现在开始更新侯捷的STL的部分了&#xff01;&#xff01;&#xff01; 完整版本会在全部更新完之后就整合发出 或者也可以直接去我的个人网站上查看 关于STL这部分&#xff0c;原课程将其分为了四部分&#xff0c;我做笔记时&#xff0c;会将其整合&#xff0c;使其更具有整体性…

OpenGLES:绘制一个颜色渐变的圆

一.概述 今天使用OpenGLES实现一个圆心是玫红色&#xff0c;向圆周渐变成蓝色的圆。 本篇博文的内容也是后续绘制3D图形的基础。 实现过程中&#xff0c;需要重点关注的点是&#xff1a;如何使用数学公式求得图形的顶点&#xff0c;以及加载颜色值。 废话不多说&#xff0c…

【ROS 2】-2 话题通信

所有内容请看&#xff1a; 博客学习目录_Howe_xixi的博客-CSDN博客https://blog.csdn.net/weixin_44362628/article/details/126020573?spm1001.2014.3001.5502飞书原文链接&#xff1a; Docs

LeetCode算法题---第3天

注:大佬解答来自LeetCode官方题解 121.买卖股票的最佳时期 1.题目 2.个人解答 function maxProfit(prices) {//更新最低价格和最大利润let minPrice prices[0];let maxProfit 0;for (let i 1; i < prices.length; i) {// 如果当前价格比最低价格还低&#xff0c;更新最…

情满中秋᛫欢度国庆 | 联诚发与你共度佳节!

转眼九月份又走到尽头 国庆和中秋正好撞了个满怀 随风飘扬的国旗与满街飘香的月饼 国泰民安与阖家团圆 这是大家与小家最美好的祈愿 当中秋遇上国庆&#xff0c;当团圆遇上国诞 双节来临之际 为庆祝传统佳节与祖国生日 也为感谢联诚发每位员工的辛勤付出 9月28日下午 …

如何礼貌委婉地拒绝上级领导的加班要求?

案例&#xff1a;领导发消息问我今天晚上能否加班完成一项工作&#xff0c;但我已经和一个重要的朋友约好了今晚一起吃饭&#xff0c;我该如何礼貌委婉地拒绝上级领导的加班要求&#xff0c;并且不让上级领导对我产生不好的印象呢? 回复&#xff1a;当面临类似情况时&#xf…

从零开始之了解电机及其控制(11)实现空间矢量调制

广泛地说&#xff0c;空间矢量调制只是将电压矢量以及磁场矢量在空间中调制到任意角度&#xff0c;通常同时最大限度地利用整个电压范围。 其他空间矢量调制模式确实存在&#xff0c;并且根据您最关心的内容&#xff0c;它们可能值得研究。 如何实际执行这种所谓的交替反向序列…

通过http发送post请求的三种Content-Type分析

通过okhttp向服务端发起post网络请求&#xff0c;可以通过Content-Type设置发送请求数据的格式。 常用到的三种&#xff1a; 1&#xff09;application/x-www-form-urlencoded; charsetutf-8 2&#xff09;application/json; charsetutf-8 3&#xff09;multipart/form-dat…

代理IP和Socks5代理在游戏领域的重要应用

随着在线游戏的兴起&#xff0c;网络工程师在游戏领域的作用变得愈发关键。他们不仅需要优化网络性能&#xff0c;还需要确保游戏体验的流畅性。本文将深入探讨代理IP和Socks5代理在游戏领域的关键应用和影响。 降低游戏延迟 在竞技游戏和多人在线游戏中&#xff0c;低延迟是…

SecureCRT连接Amazon EC2 Linux AMI

SecureCRT连接Amazon EC2 Linux AMI_securecrt aws ec2_姜亚轲的博客-CSDN博客 最近在AWS上创建了一台EC2实例&#xff0c;最后在创建密钥对之后下载pem证书文件&#xff0c;接下来我们讲解利用这个pem文件如何登录到EC2服务器上。 使用工具&#xff1a;SecureCRT 8.5 在AWS E…

HTML5中使用video标签

参考链接 <videocontrolscontrolslist"nodownload noplaybackrate"disablePictureInPicture"true"disableRemotePlayback"true"src"https://www.runoob.com/try/demo_source/movie.mp4"></video>隐藏下载&#xff1a;nod…

ios证书类型及其作用说明

ios证书类型及其作用说明 很多刚开始接触iOS证书的开发者可能不是很了解iOS证书的类型功能和概念。下面对iOS证书的几个方面进行介绍。 apple开发账号分类&#xff1a; 免费账号&#xff1a; 无需支付费用给apple&#xff0c;使用个人信息注册的账号 可以开发测试安装&…

No133.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【函数式编程】函数式编程、纯函数、高阶函数以及函数柯里化

最近在学习React&#xff0c;看到了高阶函数以及函数柯里化等概念&#xff0c;因为对这些内容还比较生疏&#xff0c;于是查找了资料&#xff0c;发现都跟一个叫函数式编程的思想有关&#xff0c;于是搜集各方资料&#xff0c;稍微系统性地做了点自己的记录用于以后的复习。想要…

Android AMS——ATMS解析(四)

ActivityTaskManagerService 是 Android 系统中的核心服务之一,它负责管理应用程序的活动(Activity)和任务栈(Task Stack)。这里我们接上一篇内容继续分析 APP 启动流程, startActivity() 方法,调用了 ATMS,我们继续往下看。 一、ATMS源码分析 1、ActivityTaskManage…