当前位置: 首页 > news >正文

IO进程线程;进程,发送信号;进程,消息队列通信;0903

思维导图

父进程,非阻塞,回收子进程

代码

#include<myhead.h>
void handler(int signum)//函数 捕获信号后 ,怎么操作
{if(signum==SIGCHLD)//捕获到 SIGCHLD 回收子进程的资源{while(waitpid(-1,NULL,WNOHANG)>0);//循环 回收子进程的资源//回收任意子进程 非阻塞 }
}
int main()
{if(signal(SIGCHLD,handler)==SIG_ERR)//signal函数 捕获信号//默认 SIGCHLD会被忽略{perror("signal error");//上面的 signal函数会置位错误码 所以可以用perrorreturn -1;}while(1){if(fork()==0){exit(EXIT_SUCCESS);}}return 0;
}

运行情况

两个程序,从消息队列,发送接受数据

代码

msgrcv.c

#include<myhead.h>
//r.out 父进程接收,子进程发送
//自定义 消息结构体
struct msgbuf{long mtype;char mtext[1024];//消息正文大小 可自定义
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main()
{//创建key值 要一样才行key_t key=ftok("/",'x');if(key==-1)//判断 key值创建成功{perror("ftok error");return -1;}//打开 同一个消息列表int Messageid=msgget(key,IPC_CREAT);if(Messageid==-1)//判断 创建消息队列成功{perror("msgget error");return -1;}//定义 发送的数据的 结构体变量struct msgbuf buff;//创建多进程int pid=fork();//父进程 接收消息 类型1if(pid>0){while(1){//默认 接收类型1//接收内容msgrcv(Messageid,&buff,SIZE,1,0);//阻塞形式接收printf("%s\n",buff.mtext);}}//子进程 发送消息 类型2else if(pid==0){while(1){//默认 发送类型2buff.mtype=2;//发送内容fgets(buff.mtext,SIZE,stdin);//fgets 从终端接收 SIZE字节 >保存到buff.mtextbuff.mtext[strlen(buff.mtext)-1]='\0';//把 数据正文的末尾 置'\0'//发送数据msgsnd(Messageid,&buff,SIZE,0);//以阻塞的形式发送,但是这个程序应该不会遇到阻塞的情况,因为另一个程序会把写进消息队列的马上读出来}}return 0;
}

msgsnd.c

#include<myhead.h>
//s.out 父进程发送,子进程接收//自定义 消息结构体
struct msgbuf{long mtype;char mtext[1024];//消息正文大小 可自定义
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main()
{//创建 key值key_t key=ftok("/",'x');if(key==-1)//判断 key值创建成功{perror("ftok error");return -1;}//创建 消息队列int Messageid=msgget(key,IPC_CREAT|0644);if(Messageid==-1)//判断 创建消息队列成功{perror("msgget error");return -1;}//定义 发送的数据的 结构体变量struct msgbuf buff;//创建 多进程int pid=fork();//父进程 发送消息 类型1if(pid>0){while(1){//默认 发送类型1buff.mtype=1;//发送内容fgets(buff.mtext,SIZE,stdin);//fgets 从终端接收 SIZE字节 保存到buff.mtextbuff.mtext[strlen(buff.mtext)-1]='\0';//把 数据正文的末尾 置'\0'//发送数据msgsnd(Messageid,&buff,SIZE,0);//以阻塞的形式发送,但是这个程序应该不会遇到阻塞的情况,因为另一个程序会把写进消息队列的马上读出来}}//子进程 接收消息 类型2else if(pid==0){while(1){//默认 接收类型2//接收内容msgrcv(Messageid,&buff,SIZE,2,0);//阻塞形式接收printf("%s\n",buff.mtext);}}return 0;
}

运行情况

牛客刷题

http://www.xdnf.cn/news/1439443.html

相关文章:

  • 如何利用SMS、RDS把服务从阿里云迁移到华为云
  • FastGPT社区版大语言模型知识库、Agent开源项目推荐
  • 矿山 6KV 不接地系统中的绝缘监测解决方案
  • 简述 Java 的异常体系结构。Error 和 Exception 有什么区别?
  • 小米fastboot不能被电脑识别但手机正常使用模式时能被电脑识别
  • 【工具变量】“国家级大数据综合试验区”试点城市DID(2000-2024年)
  • FPGA ad9248驱动
  • Windows/Linux下vscode+vcpkg管理C++包链接方法
  • CD75.【C++ Dev】异常
  • 从发现到恢复,看瑞数信息如何构建“抗毁重构”实战路径
  • 网站建设需要多少费用?网站建设的步骤和流程?
  • 01-Redis 发展简史与核心定位解析:从诞生到三大产品矩阵
  • 涉私数据安全与可控匿名化利用机制研究(上)
  • Zotero白嫖腾讯云翻译
  • AI优化SEO关键词策略指南
  • 计算机网络---CA证书体系(Certificate Authority)
  • 机器学习从入门到精通 - 逻辑回归为什么是分类之王?深入决策边界与概率校准
  • 亚马逊ASIN定位广告想爆单?先搞懂流量逻辑!多账号增效策略直接用
  • Java版本兼容性:JDK 21的SDK在JDK 1.8使用
  • 嵌入式学习 day63 LCD屏幕驱动、ADC驱动、HC-SR04、ds18b20
  • 什么是好的系统设计
  • LangGraph MCP智能体开发
  • 【JavaEE】(22) Spring 事务
  • 飞算JavaAI炫技赛:一天完成学生成绩综合统计分析系统开发(含源码)
  • 【Axure高保真原型】区间缩放柱状图
  • 数据结构从青铜到王者第二十话---Map和Set(3)
  • 漫谈《数字图像处理》之图像清晰化处理
  • 配置机载电脑开机自启动ros2节点和配置can0
  • 【第四章:大模型(LLM)】10.微调方法与实战-(1)Prompt Tuning
  • C++ 多线程编程