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

Linux操作系统 使用共享内存实现进程通信和同步

共享内存使用

//main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){   exit(1);}   strcpy(s,"hello");shmdt(s);exit(0);
}//test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){   exit(1);}   printf("%s",s);shmdt(s);shmctl(shmid,IPC_RMID,NULL);exit(0);
}

进程a从键盘循环获取数据并拷贝到共享内存中,进程b从共享内存中获取并打印数据。要求a输入一次,b输出一次。a不输入,b也不输出

//main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);//这里加上IPC_EXCL也可以,去掉也可以assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){   exit(1);}   // strcpy(s,"hello");while(1){printf("input:\n");char buff[128]={0};fgets(buff,128,stdin);strcpy(s,buff);if(strncmp(buff,"end",3)==0){   break;}   }shmdt(s);exit(0);
}//test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){   exit(1);}   // printf("%s",s);while(1){if(strncmp(s,"end",3)==0){   break;}   printf("read:%s\n",s);sleep(1);}shmdt(s);shmctl(shmid,IPC_RMID,NULL);exit(0);
}

 上面代码会出现问题,会发现如果不sleep(1),他就会一直打印下去。所以共享内存,必须结合信号量一起使用

//sem.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#define SEM1  0
#define SEM2  1
#define SEM_MAX 2
union semun
{int val;
};void sem_init();
void sem_p(int index);
void sem_v(int index);
void sem_destroy();//sem.c
#include "sem.h"
static int semid=-1;
void sem_init()
{semid=semget((key_t)1234,SEM_MAX,IPC_CREAT|IPC_EXCL|0600);if(semid==-1){semid=semget((key_t)1234,SEM_MAX,0600);if(semid==-1){printf("sem failed!\n");return ;}}else{union semun a;int arr[SEM_MAX]={1,0};for(int i=0;i<SEM_MAX;i++){a.val=arr[i];if(semctl(semid,i,SETVAL,a)==-1){printf("semctl setval failed\n");}}}
}void sem_p(int index)
{if(index<0||index>=SEM_MAX){return ;}struct sembuf a;a.sem_num=index;a.sem_op=-1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){printf("semop p error!\n");}
}
void sem_v(int index)
{if(index<0||index>=SEM_MAX){return ;}struct sembuf a;a.sem_num=index;a.sem_op=1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){printf("semop v error!\n");}
}void sem_destroy()
{if(semctl(semid,0,IPC_RMID)==-1){printf("destroy error!\n");}
}//main.c
#include <string.h>
#include "sem.h"
#include <sys/shm.h>int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){   exit(1);}   // strcpy(s,"hello");char buff[128];sem_init();while(1){printf("input:\n");memset(buff,128,0);fgets(buff,128,stdin);sem_p(SEM1);strcpy(s,buff);sem_v(SEM2);if(strncmp(buff,"end",3)==0){   break;}   }shmdt(s);exit(0);
}//b.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
#include "sem.h"
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){   exit(1);}   // printf("%s",s);sem_init();while(1){sem_p(SEM2);if(strncmp(s,"end",3)==0){   break;}   printf("read:%s\n",s);sem_v(SEM1);}shmdt(s);sem_destroy();shmctl(shmid,IPC_RMID,NULL);exit(0);
}

相关文章:

  • PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构
  • Windows SSDT Hook(二)
  • 基于大模型预测的FicatIII-IV期股骨头坏死综合治疗研究报告
  • 深圳南山沙河社区联合心美行动举办“青少年天赋提升”助青春成长
  • 千库/六图素材下载工具
  • 【25软考网工】第九章(3)网络故障排除工具
  • 手写multi-head Self-Attention,各个算子详细注释版
  • fbdev驱动在rmmod的时候内核崩溃
  • 目标检测学习
  • Word2Vec 生成词向量
  • 考研系列—操作系统:第三章、内存管理
  • KVM——CPU独占
  • FreeRTOS通俗理解指南:基础概念 + 架构+ 内核组件+练手实验
  • LangChain-Tool和Agent结合智谱AI大模型应用实例2
  • 《数字世界的连接器:计算机网络应用全景解析》
  • 使用flex实现三栏布局,两边固定,中间自适应
  • 智能柜I立控信息I产品介绍
  • 八N皇后问题
  • LeetCode Hot100(动态规划)
  • YouTube视频广告指南:类型、投放策略与优劣势解析
  • 西安网站优化维护/网络推广策划方案
  • 华春建设工程项目管理有限公司网站/自媒体平台收益排行榜
  • 网站按钮确定后图片怎么做/搜索引擎的设计与实现
  • 宝安中心站/百度惠生活商家入驻
  • 做app网站的软件有哪些内容吗/网络推广公司企业
  • 网站建设pdf微盘/百度app官方正式版