IPC进程间通信

news2024/11/28 6:24:31

信号

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

登记信号

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

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

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 函数

#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)
	{
		int p=open("./b的pid",O_RDONLY);
			char bpid[48]={};
		while(1)
		{
			int i=read(p,bpid,47);
			if(0==i)
				break;
		}
		int Bpid=atoi(bpid);
		kill(Bpid,SIGINT);
	}
}

int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0)
	{
	}
	else
	{
		signal(SIGINT,handle);
	}
	return 0;
}
#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)
	{
		exit(0);
	}
	if(signum==SIGCHLD)
	{

	}
}

int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0)
	{
		signal(SIGCHLD,handle);
	}
	else
	{
		int p=open("./b的pid",O_WRONLY | O_TRUNC | O_CREAT,0666);
		int std_out=dup(1);
		dup2(p,1);
		printf("%d\n",getpid());
		fflush(stdout);
		dup2(std_out,1);
	}
	while(1);
	return 0;
}

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

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

相关文章

一次了解所有功能!超详细【Stable Diffusion界面】大揭秘!

对于AI绘画的初学者而言&#xff0c;一看到SD的UI界面肯定是一脸懵&#xff0c;因为有太多陌生词汇&#xff0c;什么大模型、什么提示词、什么什么采样迭代&#xff0c;和传统的画图方式完全不在一个层面上&#xff0c;学习起来就无从下手&#xff5e; 今天小元老师就给大家详…

运维高级内容--lvs按权重值轮询调度

创建5台主机(一些配置是基于实验一的基础)&#xff1a; 客户端client 172.25.254.200路由器route 172.25.254.100 192.168.0.100 &#xff08;需要eth0、eth1两个网关&#xff09;LVS 192.168.0.50webserver1 192.168.0.10webserver2 192.168.0.20 1.LVS主机&#xff1a; vim…

DataGrip安装与MySQL连接

DataGrip安装 官网&#xff1a;DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 点击页面中的【Download】进入下载界面&#xff0c;如下图所示&#xff1a; 根据自己的电脑系统选择不同的版本【windows/macOS/linux】&#xff0c;点击【.exe】可选择…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

GD32E503实现串口中断收发功能

如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…

JVM知识总结(性能调优)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 性能调优 何时进行JVM调优&#xff1f; 遇到以下情况&#xff0c…

初识C++ · 智能指针

目录 前言&#xff1a; 1 智能指针的发展历史 2 unique_ptr和shared_ptr的基本使用 3 shared_ptr的模拟实现 4 有关定制删除器 前言&#xff1a; 智能指针的引入&#xff0c;我们得先从异常开始说起&#xff0c;异常面临的一个窘境是new了多个对象&#xff0c;抛异常了会…

centos7简介和安装步骤

目录 centos简介 1.CentOS 7 简略简介 2.使用建议 vmware搭建centos7 1.centos镜像下载 2.虚拟机创建 2.1 新建虚拟机 2.2典型 2.3操作系统 2.4客户机操作系统选择 ​编辑 2.5虚拟机命名与位置安装 2.5磁盘容量 2.6完成 2.6编辑虚拟机 2.6.1内存大小编辑 2.6.…

React+vite+antd点击路由切换时出现闪屏

问题描述:点击左侧路由切换会出现闪屏的情况 页面的效果 解决方案 完整代码 import { lazy, Suspense, ReactNode } from "react"; import { Navigate, useLocation } from "react-router-dom"; import LayOut from ../pages/LayOut/LayOut import NotFo…

过滤了字母、数字、_、$的webshell命令执行技巧

目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令&#xff0c;…

学习记录703@计算机组成原理之原码、补码、反码、移码

数据表示基本概念 数据表示分为有符号数和无符号数&#xff0c;其中有符号数分为整数、纯小数、带小数&#xff1b;整数和纯小数小数点位置固定&#xff0c;统称为定点数&#xff1b;带小数小数点位置可以浮动&#xff0c;称为为浮点数&#xff0c;浮点数阶码就是整数部分&…

忘记iPhone锁屏密码,多次输出密码导致iPhone停用了怎么解锁?

iphone已停用怎么解锁&#xff1f;当因忘记iPhone锁屏密码&#xff0c;多次输入错误密码而被停用时&#xff0c;怎么解锁恢复对设备的访问是非常重要的。下面小编将给大家介绍几种解锁已停用iPhone的方法&#xff0c;一起来看看吧&#xff01; 一、使用恢复模式解锁 将iPhone连…

知识学习技巧:如何从 iPhone 恢复误操作删除的视频

您来这里主要是因为您想知道如何从 iPhone 恢复已删除的视频。实际上&#xff0c;如果视频是用 iPhone 拍摄的&#xff0c;您可以尝试在相册“最近删除”中找到它们。删除后它将保留 40 天。如果您清空了相册或无法从相册中找到已删除的视频&#xff0c;那么您必须尝试使用奇客…

系统管理篇

系统管理 一、网络管理1. 网络状态查看2. 网络和路由配置3. 网络故障排除4. 网络服务管理 二、软件管理1. 软件包管理器2. rpm包和rpm命令3. yum仓库4. 源代码编译安装5. 内核升级6. grub配置文件 三、进程管理1. 进程的概念与进程查看2. 进程的控制命令3. 进程的通信方式--信号…

Linux内核中的eMMC存储支持详解

一、eMMC概述 eMMC&#xff08;Embedded MultiMediaCard&#xff09;是一种嵌入式多媒体卡&#xff0c;是一种基于NAND Flash的闪存卡标准&#xff0c;由JEDEC&#xff08;电子设备工程联合委员会&#xff09;订立和发布。eMMC集成了NAND Flash、闪存控制器和eMMC协议接口&…

【npm】如何将开发的vite插件发布到npm

前言 简单说下 npm 是什么&#xff1a; npm 是一个 node 模块管理工具&#xff0c;也是全球最大的共享源。 npm 工具与 nodejs 配套发布&#xff0c;便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI&#xff08;控制台命令行工具&#xff09;、和 registry&#xff08;…

系统架构设计定义

系统架构设计是软件开发和信息系统构建中至关重要的一环&#xff0c;它涉及到系统的整体结构、模块划分、接口定义以及设计原则等多个方面。以下是对系统架构设计的详细阐述&#xff1a; 一、系统架构设计的定义 系统架构设计是指对系统的整体结构、模块关系、接口定义以及交互…

IDEA2023版本创建mavenWeb项目及maven的相关配置

在使用idea创建maven项目之前&#xff0c;首先要确保本地已经下载并配置好maven的环境变量&#xff0c;可以参考我主页的maven下载及环境变量配置篇。 接下来首先介绍我们需要对maven安装目录文件进行的修改介绍。 maven功能配置 我们需要需改 maven/conf/settings.xml 配置…

数字孪生水利“天空地水工”一体化监测感知行动方案的框架及目标

监测感知数据是构建数字孪生水利体系的前提和基础。&#xff0c;推进物理流域监测系统科学建设和高频乃至在线运行&#xff0c;提升水利对象全要素和治理管理全过程智能监测感知能力&#xff0c;为数字孪生水利的高保真建设运行提供有力算据保障&#xff0c;支撑构建具有“四预…

博客系统测试用例报告

一、项目背景 ⼀款基于SpringBoot实现的简易⽹站&#xff0c;功能有⽤⼾注册及登录&#xff0c;博客列表展⽰&#xff0c;博客详情查看&#xff0c;博客编写和⽂章评论 点赞功能采⽤的技术有&#xff1a;HTML、CSS、Mybatis、Token、Ajax等技术。 二、项目功能 1.注册 进入…