IPC进程间通信

信号

信号是一种终端机制,程序运行到一半的时候接收到了某种通知,程序就会立刻中断运行,转而去处理通知。

登记信号

一个进程只会接收默认的几个信号

如果想要让一个进程接收特定信号的话,必须提前在该进程中登记一下想要接收的信号

typedef void (*sighandler_t)(int);原型:sighandler_t signal(int signum, sighandler_t handler); .
调用:signal(1/2/3/.....,handler)
功能描述:将signum信号,登记为当前进程所能捕获的信号。当进程捕获到 signum 信号之后,就会中断当前的运行,转而运行 handler函数
参数 signum:想要登记的信号的编号,使用 kill -l 查看
参数 handler:void(int)类型的函数指针,信号处理函数handler除了传入一个函数指针之外,还有2个选项SIG_IGN:该信号捕获到之后,忽略处理SIG_DFL:该信号被捕获到之后,执行默认的操作原型 void handler(int signum)
调用:signal(1/2/3/.....,handler)
功能描述:一旦进程捕获到一个被signal登记的信号之后,就会调用handler函数
参数 signum:当前被捕获到的几个常用信号SIGINT:当键盘键入 ctrl + c 时候发出SIGTSTP:当键盘键入 ctrl + z 时候发出SIGCHLD:当子进程死亡的时候,自动的向其父进程发出的信号只能默认处理的信号:SIGKILL 和 SIGSTOP 无法自定义处理 或者 忽略处理
不能被忽略的信号:SIGSEGV段错误信号,但是段错误信号可以自定义处理

练习

父子进程同时捕获登记SIGINT信号

父进程:输出我是父进程

子进程:输出我是子进程

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;pid_t pid;void handler(int signum)
{printf("%d\n",getpid());if(signum == SIGINT){if(pid>0){printf("我是父进程\n");exit(0);}else if(0==pid){printf("我是子进程\n");exit(0);}}
}int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){signal(SIGINT,handler);printf("%d\n",getpid());}else{signal(SIGINT,handler);printf("%d\n",getpid());}while(1);return 0;
}

当一个子进程死亡的时候,会自动的向其父进程发出SIGCHLD信号 要求实现:当父进程接收

到子进程死亡信息的时候,回收子进程的资源,防止僵尸进程的出现

当一个子进程死亡的时候,会自动的向其父进程发出SIGCHLD信号 要求实现:当父进程接收

到子进程死亡信息的时候,回收子进程的资源,防止僵尸进程的出现

追加要求:父进程使用

循环创建500个子进程,每一个子进程创建完毕后,立刻死亡

要求测试,是否产生僵尸进程,

并做到没有僵尸进程

标准的不会产生僵尸进程的模型

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;int i=0;void handler(int signum)
{while(1){	pid_t w=waitpid(-1,0,WNOHANG);if(-1==w)return;}printf("子进程的资源已被回收\n");
}int main(int argc, const char *argv[])
{for(int i=0;i<500;i++){pid_t pid=fork();if(pid>0){printf("ppid=%d\n",getpid());signal(SIGCHLD,handler);//wait(0);}else{int p=getpid();printf("pid=%d\n",p);kill(getpid(),SIGKILL);break;}}while(1);return 0;
}

4:有2个.c文件,每个.c文件都拥有一对父子进程,总共4个进程 A a B b 现在要求实现一个多

米诺骨牌的效果:

按ctrl+c结束a进程的运行,a进程结束运行之前,通过kill函数向b进程发送SIGINT信号,b进

程死亡后,B进程回收b进程的资源后,B进程再使用kill函数向A进程发送SIGTSTP信号后,大B进程结束运行。A进程接受到B进程的SIGTSTP信号后,会后a进程的资源后也结束运行

注意:kill函数要求获得另一个进程的pid,使用文件IO

这个题需要预习一个函数叫做 kill 函数

A.c文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;void handle(int signum)
{if(signum==SIGINT){FILE* p=fopen("./b的pid","r");pid_t b_pid;fread(&b_pid,4,1,p);kill(b_pid,SIGINT);fclose(p);printf("a死亡\n");exit(0);}if(signum==SIGTSTP){wait(0);printf("A结束\n");exit(0);}
}int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){	signal(SIGINT,SIG_IGN);FILE* p1=fopen("./A的pid","w");pid_t A_pid=getpid();fwrite(&A_pid,4,1,p1);fclose(p1);signal(SIGTSTP,handle);}else{signal(SIGINT,handle);}while(1);return 0;
}

B.c文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;void handle(int signum)
{if(signum==SIGINT){sleep(1);printf("b死亡\n");exit(0);}if(signum==SIGCHLD){sleep(1);while(waitpid(-1,0,WNOHANG)!=-1);	FILE* p1=fopen("./A的pid","r");pid_t A_pid;fread(&A_pid,4,1,p1);kill(A_pid,SIGTSTP);fclose(p1);printf("B死亡\n");exit(0);}
}int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){signal(SIGCHLD,handle);}else{FILE* p=fopen("./b的pid","w");pid_t b_pid=getpid();fwrite(&b_pid,4,1,p);fclose(p);signal(SIGINT,handle);}while(1);return 0;
}

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

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

相关文章

如何进行长截图的两种方法

前言 本文主要讲2种截图方式&#xff0c;分别是谷歌和QQ。 谷歌分为Web端 和 移动端&#xff0c;选一种即可。 第一种&#xff1a;谷歌浏览器控制台自带的 1.先把控制台语言更改为中文&#xff0c;方便查看 ①.按F12&#xff0c;点击设置面板 ②.修改语言为中文并关闭 ③.点击…

2024-08-07升级记录:北斗卫星导航系统轨道信息解释

北斗三号全球星座由地球静止轨道&#xff08;GEO&#xff09;、倾斜地球同步轨道&#xff08;IGSO&#xff09;、中圆地球轨道&#xff08;MEO&#xff09;三种轨道卫星组成&#xff0c;北斗人称这三种卫星为“北斗三兄弟”。 三种轨道区别&#xff1a; 1、GEO卫星 位于距地球约…

MySQL索引的性能优化

1.数据库服务器的优化步骤 在数据库调优中&#xff0c;我们的目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xf…

腾讯云AI代码助手 —— 编程新体验,智能编码新纪元

阅读导航 引言一、开发环境介绍1. 支持的编程语言2. 支持的集成开发环境&#xff08;IDE&#xff09; 二、腾讯云AI代码助手使用实例1. 开发环境配置2. 代码补全功能使用&#x1f4bb;自动生成单句代码&#x1f4bb;自动生成整个代码块 3. 技术对话3. 规范/修复错误代码4. 智能…

python-NLP:4句法分析

文章目录 句法分析概述句法分析分类句法分析任务 句法结构分析基本概念语法形式化基本方法 依存句法分析浅层句法分析 句法分析概述 句法分析(syntacticparsing)是自然语言处理中的关键技术之一&#xff0c;其基本任务是确定句子的句法结构(syntactic structure)或句子中词汇之…

简单回归问题实战

数据表&#xff1a;链接: https://pan.baidu.com/s/1sSz7F_yf_JeumXcP4EjE5g?pwd753f 提取码: 753f 核心流程&#xff1a; import numpy as np # 计算误差函数 points是数据集中数据的位置 def compute_error_for_line_given_points(b,w,points):totalError0for i in range(0…

虚幻5|入门AI行为树,建立敌人

本章分成两块部分一块是第一点的制作一个简单的AI&#xff0c;后面第二点之后是第二部分建立ai行为树。这两个部分是一个衔接&#xff0c;最好不要跳看 一&#xff0c;制作一个简单的AI 1.首先&#xff0c;我们创建一个敌人的角色蓝图&#xff0c;添加一个场景组件widget用于…

Xmind 8思维导图(含补丁)

Xmind 8思维导图&#xff08;含补丁&#xff09; 什么是思维导图&#xff1f;如何下载Xmind8Xmind 8软件简单使用获取Xmind 8 补丁 什么是思维导图&#xff1f; 数据结构、电路模拟等学习路线&#xff0c;老师都有叫画思维导图&#xff0c;那时候我只知道上网copy&#xff0c;…

基于Spring Boot的疗养院管理系统的设计与实现

TOC springboot234基于Spring Boot的疗养院管理系统的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…

【经验分享】Java注解实战进阶

原文地址&#xff1a;https://mp.weixin.qq.com/s/gdYysBB3aD_HmPyvEThFXw Java猿的命根子&#xff01; 自Java EE框架步入Spring Boot时代之后&#xff0c;注解简直是Java程序员的命根子啊&#xff0c;面向注解编程成了日常操作&#xff01; 换句话的意思就是说&#xff1a;…

PCB入门笔记—绘制一个只有两个排针的PCB全流程记录—立创EDA专业版

PCB绘制入门&#x1f680; 硕士毕业之后准备进入博士阶段&#xff0c;本科阶段做的硬件&#xff0c;硕士阶段做的算法&#xff0c;然后博士阶段又要做回硬件了&#xff0c;因此也是打算补一补PCB相关的内容和知识&#xff0c;毕竟做控制的话&#xff0c;之后这也是不能躲开的必…

CrowdTransfer:在AIoT社区中实现众包知识迁移

这篇论文的标题是《CrowdTransfer: Enabling Crowd Knowledge Transfer in AIoT Community》&#xff0c;由 Yan Liu, Bin Guo, Nuo Li, Yasan Ding, Zhouyangzi Zhang, 和 Zhiwen Yu 等作者共同撰写&#xff0c;发表在《IEEE Communications Surveys & Tutorials》上。以下…

Hive3:常用查询语句整理

一、数据准备 建库 CREATE DATABASE itheima; USE itheima;订单表 CREATE TABLE itheima.orders (orderId bigint COMMENT 订单id,orderNo string COMMENT 订单编号,shopId bigint COMMENT 门店id,userId bigint COMMENT 用户id,orderStatus tinyint COMMENT 订单状态 -3:用…

Halcon阈值处理的几种分割方法

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…

2024-08-06升级记录:Android开发接口-获取定位卫星相关信息

Android中获取卫星信息的接口有两类&#xff1a; 一、GpsStatus 注意&#xff1a;此类在API级别24中已被弃用。 请使用GnssStatus和GnssStatus.Callback 。 这个类表示GPS引擎的当前状态。该类与 GpsStatus.Listener接口配合使用。 方法&#xff1a; 获取卫星信息&#xff…

24/8/15算法笔记 项目练习冰湖

import gym from matplotlib import pyplot as plt %matplotlib inline import os os.environ[SDL_VIDEODRIVER]dummy #设置环境变量 SDL_VIDEODRIVERdummy 是在使用基于 SDL (Simple DirectMedia Layer) 的应用程序时&#xff0c;告诉应用程序不使用任何视频驱动程序。这通常…

Transformer动画讲解-单头注意力和多头注意力

单头注意力和多头注意力 Transformer的起源&#xff1a;Google Brain 翻译团队通过论文《Attention is all you need》提出了一种全新的简单网络架构——Transformer&#xff0c;它完全基于注意力机制&#xff0c;摒弃了循环和卷积操作。 注意力机制是全部所需 正如论文标题所…

景联文科技:一文详解如何构建高质量SFT数据

在图像处理和计算机视觉领域中&#xff0c;将一张图像转化为可用于训练机器学习模型的数据是一项复杂而重要的任务。SFT&#xff08;Supervised Fine-Tuning&#xff0c;监督微调&#xff09;是一种常见的深度学习策略&#xff0c;在这一过程中发挥着核心作用。 SFT是指在一个预…

PostgreSQL-02-入门篇-查询数据

文章目录 1 简单查询SELECT 语句简介SELECT 语句语法SELECT 示例1) 使用 SELECT 语句查询一列数据的示例2) 使用 SELECT 语句查询多列数据的示例3) 使用 SELECT 语句查询表所有列数据的示例4) 使用带有表达式的 SELECT 语句的示例5) 使用带有表达式的 SELECT 语句的示例 2 列别…

【MySQL进阶之路】MySQL基础——从零认识MySQL

目录 主流数据库 什么是MySQL MySQL服务 从文件系统角度理解数据库 MySQL架构 SQL语句分类 存储引擎 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 主流数据库 数据库开发商特点适用场景SQL Server微软.NET程序员的最爱&#xff0c;适合中大型项目企业级应用&#xf…