【Linux之进程间通信】04.Linux进程间的信号通信

news/2024/11/9 2:43:29/

 
【Linux之进程间通信】

项目代码获取:https://gitee.com/chenshao777/linux-processes.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)

04.Linux进程间的信号通信

【目录】
  一、进程间信号发送方式
  二、进程间信号接收方式
  三、进程间信号处理方式

一、进程间信号发送方式

1、kill函数

向指定进程发送信号

int kill(pid_t pid, int sig)

需要包含头文件

#include <sys/types.h>
#include <signal.h>

参数:

参数含义
pid进程pid(发送给哪个进程)
sig要发送的信号值(Linux一共64个信号,kill -l 即可查看)

举例:
这有一个死循环进程

#include <stdio.h>
/*四循环进程*/
int main(int argc, char *argv[])
{while(1);return 0;
}

运行 ps -axj 命令查看一下它的状态是R+,表示正在运行,且进程号是23409

 4070  23409  23409   4070 pts/1     23409 R+    1000   1:05 ./test_while

我们可以在终端执行 kill -9 23409 命令来结束该进程,但我们要通过代码来结束该进程
核心代码则为

kill(23409, SIGKILL);  //发送kill信号,结束23409进程

但是我们事先不知道进程号,所以可以通过 main 函数的参数传递进程号,执行命令如下:

./1.out 9 23409

全部代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>/*模拟 kill 命令,杀死进程命令:./1.out 9 进程号(ps -axj)
*/
int main(int argc, char *argv[])
{if(argc < 3){printf("请输入两个参数\n");return -1;}int sig;int pid;sig = atoi(argv[1]);pid = atoi(argv[2]);kill(pid, sig);printf("111\n");return 0;
}

PS:使用到了 atoi 函数,将字符串转成数字,需要包含头文件 <stdlib.h>

---------------------------------------------------------------------------------

2、raise函数

只能向自身进程发送信号

int raise(int sig);

需要包含头文件

#include <signal.h>

参数:
sig : 要发送的信号

举例:

raise(SIGTSTP);  //暂停进程
raise(9);  //杀死自己

---------------------------------------------------------------------------------

3、alarm函数

发送闹钟信号

unsigned int alarm(unsigned int seconds);

需要包含头文件

#include <unistd.h>

参数:
闹钟定时的秒数

举例:
执行 alarm(5) ,5秒后进程结束

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{alarm(5);   //5秒后结束自己的进程printf("22222\n");pause();    //进程睡眠return 0;
}

二、进程间信号接收方式

这里介绍三种方式,确保进程能够收到信号
while 循环
pause 进程睡眠
sleep 延时


三、进程间信号处理方式

使用信号处理函数 signal()

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

需要包含头文件

#include <signal.h>

参数:

参数含义
signum信号
handler信号触发后的回调函数(void类型,参数int类型)

handler有三种选择
SIG_IGN:忽略该信号
SIG_DFL:采用默认方式处理信号
函数指针:自定义信号处理函数

举例:

使用signal函数定义信号SIGALRM(闹钟信号)SIGINT(ctrl+c) 的信号处理函数

实现现象:
5秒后handler函数执行,或者按下ctrl+c,handler函数执行

#include <stdio.h>
#include <signal.h>
#include <unistd.h>/*定义信号处理函数 typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);  参数:signum: 指定信号handler: SIG_IGN:忽略该信号SIG_DFL:采用默认方式处理信号函数指针:自定义信号处理函数命令: ./signal现象:5秒后handler函数执行,或者按下ctrl+c,handler函数执行
*/
void handler(int arg)
{printf("信号处理handler,arg = %d\n", arg);  //arg是信号ID
}int main(int argc, char *argv[])
{signal(SIGALRM, handler);  //SIGALRM闹钟信号处理signal(SIGINT, handler);   //SIGINT(ctrl+c)信号处理alarm(5);   //5秒后结束自己的进程printf("22222\n");pause();  //进程睡眠return 0;
}

http://www.ppmy.cn/news/93292.html

相关文章

Kubernetes高可用集群二进制部署(Runtime Docker)v1.21版本

Kubernetes高可用集群二进制部署&#xff08;Runtime Docker&#xff09; Kubernetes&#xff08;简称为&#xff1a;k8s&#xff09;是Google在2014年6月开源的一个容器集群管理系统&#xff0c;使用Go语言开发&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xf…

鸿蒙Hi3861学习十八-DevEco Device Tool环境搭建

一、简介 在之前的文章中&#xff0c;我们是通过在windows下烧录&#xff0c;在ubuntu下编译的方式进行开发。今天我们同样是采用windowsubuntu混合环境进行开发。为什么要采用这种方式呢&#xff1f;因为就目前而言&#xff0c;大部分的开发板还不支持在Windows环境下进行编译…

【Python】使用百度AI能力

知识目录 一、写在前面✨二、百度AI能力介绍三、植物识别四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 Python调用百度AI能力进行植物识别。 &#xff0c;希望能帮助到大…

代码随想录训练营Day53| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

目录 学习目标 学习内容 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习目标 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习内容 1143.最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09;ht…

el-table分页保留勾选的数据

1、目标效果 代码全部写在下方App.vue中&#xff0c;复制粘贴即可运行 目前选中了5条数据 点击下方切换分页&#xff0c;选中的数据消失了 2、原理 &#xff08;1&#xff09;el-table复选框&#xff0c;用一个变量数组selectedRow:[ ] 监听选择了哪些数据 <el-table-colu…

如何修改滚动条样式?

.bigbox{ /* 设置滚动条的样式 */ ::-webkit-scrollbar { width: 8px; height: 10px; background-color: #f5f5f5; } /*定义滚动条轨道 内阴影圆角*/ ::-webkit-scrollbar-track { background-color: #f5f5f5; } /*定义滑块 内阴影圆角*/ ::-webkit-scrollbar-thumb { borde…

Spring注解的使用

第一步&#xff1a;加入aop的依赖第二步&#xff1a;在配置文件中添加context命名空间第三步&#xff1a;在配置文件中指定扫描的包第四步&#xff1a;在Bean类上使用注解 第一步&#xff1a;加入aop的依赖 我们可以看到当加入spring-context依赖之后&#xff0c;会关联加入a…

【全年汇总】2023年CCF体系结构/并行与分布计算/存储系统会议截稿时间汇总(持续更新)

本博文是根据CCF会议推荐的计算机体系结构/并行与分布计算/存储系统领域相关会议目录撰写。 一、截稿时间总览 截稿时间的总时间轴内容将会持续更新...... 往年投稿及录用情况及链接详见图片后面的内容。 二、会议详细目录 由于一些会议的投稿时间还没公开&#xff0c;因此根据…