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

【IO】进程间通信(IPC)练习

1>将课堂代码自己敲熟练


2>使用消息队列实现两个程序的相互通信

htr.c

#include <myhead.h>
//2.自定义消息类型结构体
struct msgbuf
{long mtype;char mtext[1024];
};
//宏定义一个消息的正文大小
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{//3.创建一个key值key_t key=ftok("/",'k');if(key==-1){perror("ftok error");return -1;}//4.用key创建消息队列int msqid=msgget(key,IPC_CREAT);if(msqid==-1){perror("msgget error");return -1;}printf("msqid = %d\n",msqid);struct msgbuf buf;//1.创建父子进程pid_t pid=fork();if(pid>0){while(1){/*printf("发送信息给绿机类型:");scanf("%ld",&buf.mtype);getchar();*/buf.mtype=1;printf("消息正文:");fgets(buf.mtext,SIZE,stdin);buf.mtext[strlen(buf.mtext)-1]=0;//退出判断if(strcmp(buf.mtext,"quit")==0){break;}msgsnd(msqid,&buf,SIZE,0);}}else if(pid==0){while(1){msgrcv(msqid,&buf,SIZE,2,0);printf("接收信息为:%s\n",buf.mtext);}}return 0;
}

hts.c

#include <myhead.h>
//2.自定义消息类型结构体
struct msgbuf
{long mtype;char mtext[1024];
};//宏定义一个消息的正文大小
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{//3.创建一个key值key_t key=ftok("/",'k');if(key==-1){perror("ftok error");return -1;}//4.用key创建消息队列int msqid=msgget(key,IPC_CREAT);if(msqid==-1){perror("msgget error");return -1;}printf("msqid = %d\n",msqid);struct msgbuf buf;//1.创建父子进程pid_t pid=fork();if(pid>0){while(1){msgrcv(msqid,&buf,SIZE,1,0);printf("接收信息为:%s\n",buf.mtext);}}else if(pid==0){while(1){/*printf("发送信息给红机类型:");scanf("%ld",&buf.mtype);getchar();*/buf.mtype=2;printf("消息正文:");fgets(buf.mtext,SIZE,stdin);buf.mtext[strlen(buf.mtext)-1]=0;//退出判断if(strcmp(buf.mtext,"quit")==0){break;}msgsnd(msqid,&buf,SIZE,0);}}return 0;
}

3> 使用信号实现非阻塞方式回收僵尸进程练习五遍

(重复内容纯手打)

#include <myhead.h>
void handlar(int signum)
{if(signum==SIGCHLD){while(waitpid(-1,NULL,WNOHANG)>0);}
}int main(int argc, const char *argv[])
{if(signal(SIGCHLD,handlar)==SIG_ERR){perror("signal error");return -1;}for(int i=0;i<10;i++){if(fork()==0){exit(EXIT_SUCCESS);}}return 0;
}/*#include <myhead.h>//3.回收
void handlar(int signum)
{if(signum==SIGCHLD)while(waitpid(-1,NULL,WNOHANG)>0);
}int main(int argc, const char *argv[]){//2.消息绑定if(signal(SIGCHLD,handlar)==SIG_ERR){perror("signal error");return -1;}//1.僵尸进程产生for(int i=0;i<10;i++){if(fork()==0){exit(EXIT_SUCCESS);	}}return 0;}
*/
/*
#include <myhead.h>
void handlar(int signum)
{if(signum==SIGCHLD)while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(int argc, const char *argv[])
{if(signal(SIGCHLD,handlar)==SIG_ERR){perror("signal error");return -1;}for(int i=0;i<9;i++)if(fork()==0)exit(EXIT_SUCCESS);return 0;
}
*/
/*
#include <myhead.h>
void handlar(int signum)
{if(signum==SIGCHLD)while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(int argc, const char *argv[])
{if(signal(SIGCHLD,handlar)==SIG_ERR){perror("signal error");return -1;}for(int i=0;i<10;i++)if(fork()==0)exit(EXIT_SUCCESS);return 0;
}
*/
/*
#include <myhead.h>
void handlar(int signum)
{if(signum==SIGCHLD)while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(int argc, const char *argv[])
{if(signal(SIGCHLD,handlar)==SIG_ERR){ perror("signal error"); return -1;}for(int i=0;i<10;i++)if(fork()==0)exit(EXIT_SUCCESS);return 0;
}
*/

4>思维导图

5>牛客网

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

相关文章:

  • Unity 的游戏循环机制
  • 66车载诊断架构 --- 从架构系统角度怎么确保整车DTC的完整性?
  • (二)文件管理-基础命令-pwd命令的使用
  • 计算机视觉(六):腐蚀操作
  • 电脑城老板不会告诉你的装机秘籍:建造者模式让你的代码高配起飞!
  • 基于深度学习的医疗器械生产备案凭证识别技术,实现从图像到结构化数据的智能转化
  • pytorch初级
  • 八、算法设计与分析
  • 新后端漏洞(上)- Python unpickle 造成任意命令执行漏洞
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1
  • RoPE位置编码缩放因子的最优解:频率维度与位置敏感度的精妙权衡
  • SpringBoot项目package报错 PKIX path building failed 终极解决方案:Nexus私服证书导入JDK证书库
  • C++对象构造与析构
  • 2.插值法
  • Spring Boot 实现数据库表变更监听的 Redis 消息队列方案
  • 技术方案之Mysql部署架构
  • uni app 的app 端调用tts 进行文字转语音
  • GDAL 下载安装
  • C题目训练【三连击】
  • Vue3 + Ant Design Vue 实现多选下拉组件(支持分组、搜索与标签省略)
  • Ollama大模型 本地部署+使用教程
  • 【FastDDS】Layer DDS之Domain ( 05-Creating a DomainParticipant)
  • lesson53:CSS五种定位方式全解析:从基础到实战应用
  • GEO服务商推荐:移山科技以划时代高精尖技术引领AI搜索优化新纪元
  • C++ 5
  • 使用 Acme.sh 获取和管理免费 SSL 证书
  • 性能测试-jmeter8-脚本录制
  • 网络通信与协议栈 -- TCP协议与编程
  • [Java]PTA:求最大值
  • 财务文档处理优化:基于本地运行的PDF合并解决方案