IO进程线程 day7 进程间通信

 1.使用消息队列完成两个进程之间相互通信

 2.信号通信相关代码的重新实现

(1)signal函数的实例

#include <head.h>//定义信号处理函数
void handler(int signum)
{if(signum == SIGINT)      //表明要处理2号信号{printf("用户按下了ctrl + c键\n");}if(signum == SIGTSTP)          //处理暂停信号{printf("用户按下了ctrl + z键\n");}
}/****************************主程序********************/
int main(int argc, const char *argv[])
{/*将SIGINT信号忽略if(signal(SIGINT, SIG_IGN) == SIG_ERR){perror("signal error");return -1;}*//*将SIGINT信号默认处理if(signal(SIGINT, SIG_DFL) == SIG_ERR){perror("signal error");return -1;}*///将SIGINT信号捕获if(signal(SIGINT, handler) == SIG_ERR){perror("signal error");return -1;}//绑定SIGTSTP信号 ctrl + zif(signal(SIGTSTP, handler) == SIG_ERR){perror("signal error");return -1;}while(1){sleep(1);printf("我真的还想再活五百年\n");}return 0;
}

(2)尝试捕获SIGSTOP信号

#include <head.h>//定义信号处理函数
void handler(int signum)
{if(signum == SIGINT)      //表明要处理2号信号{printf("用户按下了ctrl + c键\n");}if(signum == SIGTSTP)          //处理暂停信号{printf("用户按下了ctrl + z键\n");}if(signum == SIGSTOP)          //处理暂停信号{printf("用户按下了ctrl + z键\n");}
}/****************************主程序********************/
int main(int argc, const char *argv[])
{/*尝试忽略SIGSTOP信号if(signal(SIGSTOP, SIG_IGN) == SIG_ERR){perror("signal error");return -1;}*//*尝试捕获SIGSTOP信号if(signal(SIGSTOP, handler) == SIG_ERR){perror("signal error");return -1;}*///尝试默认处理SIGSTOP信号if(signal(SIGSTOP, SIG_DFL) == SIG_ERR){perror("signal error");return -1;}while(1){sleep(1);printf("我真的还想再活五百年\n");}return 0;
}

(3)使用信号的方式以非阻塞的形式回收僵尸进程(SIGCHLD)

#include <head.h>//定义信号处理函数
void handler(int signum)
{if(signum == SIGCHLD){//以非阻塞的形式回收僵尸进程,直到所有的僵尸进程全部回收结束while(waitpid(-1, NULL, WNOHANG) >0 );}
}int main(int argc, const char *argv[])
{//捕获子进程发来的SIGCHLD信号if(signal(SIGCHLD, handler) == SIG_ERR){perror("signal error");return -1;}for(int i=0; i<10; i++){if(fork() == 0){exit(EXIT_SUCCESS);}}while(1);return 0;
}

(4)使用闹钟信号完成一个定时器(SIGALRM),该信号由alarm函数设置的时间超时后产生

#include <head.h>int main(int argc, const char *argv[])
{printf("%d\n", alarm(10));           //0sleep(5);printf("%d\n", alarm(10));           //5while(1);return 0;
}

(5)使用SIGALRM信号模拟斗地主出牌场景

#include <head.h>//定义信号处理函数
void handler(int signo)
{if(signo == SIGALRM){printf("系统已经随机为您出一张牌\n");alarm(5);}
}int main(int argc, const char *argv[])
{char ch;//将SIGALRM信号绑定到信号处理函数中if(signal(SIGALRM, handler) == SIG_ERR){perror("signal error");return -1;}while(1){alarm(5);printf("请出牌:");scanf("%c", &ch);getchar();printf("您出的牌为:%c\n", ch);}return 0;
}

(6)信号发送函数(kill、raise)

#include <head.h>//定义信号处理函数
void handler(int signo)
{if(signo == SIGUSR1){printf("逆子何至于此\n");raise(SIGKILL);     //自杀}
}int main(int argc, const char *argv[])
{//定义进程号pid_t pid = fork();if(pid > 0){//父进程//将SIGUSR1信号绑定if(signal(SIGUSR1, handler) == SIG_ERR){perror("signal error");return -1;}while(1){printf("我真的还想再活五百年\n");sleep(1);}}else if(pid == 0){//子进程printf("人生得意须尽欢,莫使金樽空对月\n");sleep(3);printf("我看透了红尘, 父亲跟我一起走吧\n");//向父进程发送一个信号kill(getppid(), SIGUSR1);exit(EXIT_SUCCESS);        //退出进程}else{perror("fork error");return -1;}return 0;
}

3.共享内存相关代码重新实现

(1)发送端

#include <head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//1、创建key值key_t key = -1;if((key = ftok("/", 't')) == -1){perror("ftok error");return -1;}printf("key = %#x\n", key);//2、将物理内存创建出共享内存段int shmid = 0;if((shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664)) == -1){perror("shmget error");return -1;}printf("shmid = %d\n", shmid);//3、将共享内存段地址映射到用户空间//NULL表示让系统自动选择页的分段//0表示当前进程对共享内存具有读写功能char *addr = (char *)shmat(shmid, NULL, 0);if(addr == (void *)-1){perror("shmat error");return -1;}printf("addr = %p\n", addr);//4、操作共享内存//char buf[128] = "";while(1){fgets(addr, PAGE_SIZE, stdin);   //从终端输入数据addr[strlen(addr) - 1] = '\0';    //将换行换成'\0'if(strcmp(addr, "quit") == 0){break;}}//5、取消映射while(1);return 0;
}

(2)接收端

#include <head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//1、创建key值key_t key = -1;if((key = ftok("/", 't')) == -1){perror("ftok error");return -1;}printf("key = %#x\n", key);//2、将物理内存创建出共享内存段int shmid = 0;if((shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664)) == -1){perror("shmget error");return -1;}printf("shmid = %d\n", shmid);//3、将共享内存段地址映射到用户空间//NULL表示让系统自动选择页的分段//0表示当前进程对共享内存具有读写功能char *addr = (char *)shmat(shmid, NULL, 0);if(addr == (void *)-1){perror("shmat error");return -1;}printf("addr = %p\n", addr);//4、操作共享内存//char buf[128] = "";while(1){printf("共享内存中的数据为:%s\n", addr);sleep(1);if(strcmp(addr, "quit") == 0){break;}}//5、取消映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//6、删除共享内存if(shmctl(shmid, IPC_RMID, NULL) == -1){perror("shmctl error");return -1;}return 0;
}

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

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

相关文章

将Llama2上下文长度扩展100倍;效率更高的SeTformer;LLM准确度基本不变加速1.56×;FreeTalker

本文首发于公众号&#xff1a;机器感知 将Llama2上下文长度扩展100倍&#xff1b;效率更高的SeTformer&#xff1b;LLM准确度基本不变加速1.56&#xff1b;FreeTalker Latte: Latent Diffusion Transformer for Video Generation 本文使用Latent Diffusion Transformer(Latte…

pod探针2:

就绪探针演示&#xff1a; 演示探针失败 存活探针&#xff08;livenessProde&#xff09;&#xff1a;探测容器是否是否运行正常&#xff0c;如果探测失败则kubelet杀掉容器&#xff08;不是Pod&#xff09;&#xff0c;容器会根据重启策略决定是否重启 就绪探针&#xff08;re…

tcp/ip协议2实现的插图,数据结构6 (24 - 章)

(142) 142 二四1 TCP传输控制协议 tcpstat统计量与tcp 函数调用链 (143) 143 二四2 TCP传输控制协议 宏定义与常量值–上 (144) 144 二四3 TCP传输控制协议 宏定义与常量值–下 (145) 145 二四4 TCP传输控制协议 结构tcphdr,tcpiphdr (146) 146 二四5 TCP传输控制协议 结构 tcp…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

互斥、自旋、读写锁的应用场景

互斥、自旋、读写锁的应用场景 锁&#x1f512;1、互斥锁、自旋锁2、读写锁&#xff1a;读写的优先级3、乐观锁和悲观锁总结&#xff1a; 锁&#x1f512; ​ 多线程访问共享资源的生活&#xff0c;避免不了资源竞争而导致错乱的问题&#xff0c;所以我们通常为了解决这一问题…

竞赛保研 基于深度学习的人脸识别系统

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

【开源GPT项目 - 在问】让知识无界,智能触手可及

Chatanywhere: chatAnywhere 在问 | 让知识无界&#xff0c;智能触手可及 项目简介 这是一个免费的在线聊天工具&#xff0c;旨在让用户更方便地享受科技带来的便利。用户可以使用我们的工具来获取答案、寻求建议、进行翻译和计算等等。这是由一位个人开发者创建的&#xff…

thinkadmin安装步骤

一,先cmd运行安装命令 ### 创建项目( 需要在英文目录下面执行 ) composer create-project zoujingli/thinkadmin二,在confing中的database.php配置数据库 三,将仓库的data复制到app目录下 https://gitee.com/zoujingli/think-plugs-data 四,在cmd运行命令安装数据库 //…

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述 参考计算机网络教材 140 页 4.3 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…

使用SpirngBoot时部分编译报错解决方案:

1. 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。 报错截图&#xff1a; 解决方案&#xff1a; 找到springboot的java版本看是多少版本&#xff0c;springboot 3.0以上的版本需要最低JDK17的版本&#xff0c;所以查看你自己…

LeetCode 2397. 被列覆盖的最多行数:二进制枚举

【LetMeFly】2397.被列覆盖的最多行数&#xff1a;二进制枚举 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-rows-covered-by-columns/ 给你一个下标从 0 开始的 m x n 二进制矩阵 mat 和一个整数 cols &#xff0c;表示你需要选出的列数。 如果一行中&am…

Transformer从菜鸟到新手(五)

引言 上篇文章我们在单卡上完成了完整的训练过程。 从本文开始介绍模型训练/推理上的一些优化技巧&#xff0c;本文主要介绍多卡并行训练。 下篇文章将介绍大模型推理常用的缓存技术。 多卡训练 第一个要介绍的是利用多GPU优化&#xff0c;因为在单卡上训练实在是太慢。这…

ip协议历史

今天的互联网&#xff0c;是万维网&#xff08;WWW&#xff09;一家独大。而在上世纪七八十年代&#xff0c;人们刚开始尝试网络连接时&#xff0c;那时出现了计算机科学研究网络、ALOHA 网、因时网、阿帕网等不同类型的网络&#xff0c;这些网络之间互相通信是个难题。 于是&…

IDEA 常用快捷键大全(建议收藏)

代码开发时 常用快捷键 快捷键功能使用建议CtrlAltOOptimize imports 比较实用 去除导入的无用的包CtrlAltIAuto-indent line(s) 比较实用 自动缩进代码CtrlAltLReformat code 比较实用 格式化选中的代码CtrlAltShiftL 比较实用 格式化整个文件TabIndent 比较实用 缩进Sh…

MySQL之导入、导出

文章目录 1.navicat导入导出2.mysqldump命令导入导出2.1导出2.2导入 3.load data infile命令导入导出4.远程备份5.思维导图 1.navicat导入导出 使用Navicat工具导入t_log 共耗时 55s 2.mysqldump命令导入导出 2.1导出 导出表数据和表结构 语法&#xff1a; mysqldump -u用…

Pytest接口自动化测试框架搭建

一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架&#xff0c;网上也有很多的文章讲述相关的知识。最近自己也抽时间梳理了一份pytest接口自动化测试框架&#xff0c;因此准备写文章记录一下&#xff0c;做到尽量简单通俗易懂&#xff0c;当然前提是基本的py…

vue中鼠标拖动触发滚动条的移动

前言 在做后端管理系统中&#xff0c;像弹窗或大的表单时&#xff0c;经常会有滚动条的出现&#xff0c;但有些时候如流程、图片等操作时&#xff0c;仅仅使用鼠标拖动滚动条操作不太方便&#xff0c;如果使用鼠标拖拽图片或容器来触发滚动条的移动就比较方便了 功能设计 如…

519基于单片机的自动切割流程控制系统

基于单片机的自动切割流程控制系统[proteus仿真] 自动切割流程控制系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于单片机的自动切割流程控制系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&…

java智慧医院互联网智慧3D导诊系统源码,经由智慧导诊系统多维度计算,准确推荐科室

什么是智慧导诊系统? 简单地说&#xff0c;智慧导诊系统是一种利用人工智能技术&#xff0c;为医生提供帮助的系统。它可以通过分析患者的症状和病史为医生提供疾病诊断和治疗方案的建议。 系统介绍&#xff1a; 医院智慧导诊系统是在医院中使用的引导患者自助就诊挂号&…

拼多多API:从数据中挖掘商业价值的力量

随着大数据时代的来临&#xff0c;数据已经成为企业决策和创新的基石。拼多多API作为电商领域的重要接口&#xff0c;为企业提供了从数据中挖掘商业价值的机会。通过拼多多API&#xff0c;企业可以获取丰富的用户数据、商品数据和交易数据&#xff0c;从而深入了解市场需求、优…