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.hqwc.cn/news/334691.html

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

相关文章

Linux的网络配置命令和网络设置实操

目录 一、网路命令 1.ifconfig 2.hostname 3.route 4.netstat 5.ss&#xff08;socket statistics&#xff09; 6.ping 7.nslookup 8.tcpdump 二、实操 1.单个网卡修改 2.双网卡配置 3.bond网卡绑定 一、网路命令 查看Linux基础的网络设置 网关route -nIP地址ifc…

The Sandbox 2024 Game Jam 启动|向博姆库斯博士证明你的游戏开发实力!

The Sandbox Game Jam 是面向所有游戏制作爱好者的创作比赛&#xff01;我们诚邀您加入 The Sandbox 的生态系统&#xff0c;这里充满活力&#xff0c;游戏与文化相融&#xff0c;创作者彼此切磋&#xff0c;共同实现梦想。唯一能限制您的只有想象力。The Sandbox 游戏由大家共…

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用…

JVM的FastThrow优化机制

前言&#xff1a; 前一阵子&#xff0c;在公司排查线上问题发现&#xff1a;出问题的方法报空指针异常&#xff0c;但是没有异常堆栈信息和Message。我一开始以为是代码中做了处理&#xff0c;但是经过翻阅代码发现不是。最后一番查找资料&#xff0c;这种现象是JVM的一种优化机…

windows rtmp发送数据流程抓包

一、connect 返回Window Acknowledgement Size&#xff1a; 返回Set Peer Bandwidth 二、 releaseStream 三、 FCPublish 四、 createStream 五、 _checkbw 六、 FCPublish返回 七、createStream 八、 _checkbw返回 九、发送关键帧 十、发送视频帧 十一、FCUnpublish 十二、del…

【小白专用】C#关于角色权限系统

&#xff08;C#&#xff09;用户、角色、权限 https://www.cnblogs.com/huangwen/articles/638050.html 权限管理系统——数据库的设计&#xff08;一&#xff09; https://www.cnblogs.com/cmsdn/p/3371576.html 权限管理系统——菜单模块的实现&#xff08;二&#xff09; …

RabbitMQ发布确认

1.单个确认 单个确认发布是一种同步确认发布方式&#xff0c;也就是发布一个消息后只有它被确认发布&#xff0c;后续的消息才能继续发布。 缺点:发布速度特别慢,因为若是没有确认发布的消息会阻塞所有后续消息的发布 package com.hong.rabbitmq5;import com.hong.utils.Rabb…

C# 反射的乌云,MethodInfo的Json序列化参数入参问题

文章目录 前言直接运行MethodInfo运行结果 Json解决ParamterInfo实例化运行结果无法实例化问题部分参数的问题 Json反序列化 经过长达一天的研究&#xff0c;我终于完全的解决的了实战思路方法测试用例运行测试运行结果 代码总结总结 前言 我上篇文章已经基本解决了反射的基本…

vivado 创建编译后工程

创建后期合成项目 合成后项目以合成网表、完全生成的块设计、完全生成的IP以及相应的约束。然后&#xff0c;您可以分析、布局和实施设计 注意&#xff1a;您可以使用XST或第三方合成工具来创建合成网表。 重要&#xff01;使用EDIF和NGC文件时&#xff0c;顶部单元格名称必…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Tool和Tool_Call(含前function call)

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了&#xff0c;必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

Python操作excel-读取、表格填充颜色区分

1.场景分析 遇到一个需要读取本地excel数据&#xff0c;处理后打入到数据库的场景&#xff0c;使用java比较重&#xff0c;python很好的解决了这类问题 2.重难点 本场景遇到的重难点在于&#xff1a; 需要根据表格内的背景颜色对数据进行筛选 读取非默认Sheet 总是出现Value…

vue3 封裝一个常用固定按钮组件(添加、上传、下载、删除)

效果图 这个组件只有四个按钮&#xff0c;添加&#xff0c;上传、下载、删除&#xff0c;其中删除按钮的颜色默认是灰色&#xff0c;当表格有数据选中时再变成红色 实现 组件代码 <script lang"ts" setup> import { Icon } from /components/Icon/index im…