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

Day07_C语言IO进程线程(重难点)

01.思维导图

02.共享内存基本代码(没有考虑同步互斥的情况)

01_memory_w.c

#include <25051head.h>
int main(int argc, const char *argv[])
{//1.创建秘钥key_t key;if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a'))){ERRLOG("ftok_error");}//2.创建共享内存int shmid=shmget(key,128,IPC_CREAT|0777);if(-1==shmid){ERRLOG("shmget_error");}//3.映射void* shmaddr=shmat(shmid,NULL,0);if((void*)-1==shmaddr){ERRLOG("shmat_error");}char *buf=(char*)shmaddr;strcpy(buf,"hello");while(1);
#if 0while(1){memset(buf,0,128);printf("请输入>>>>>");scanf("%s",buf);}
#endif//4.断开映射if(-1==shmdt(shmaddr)){ERRLOG("shmdt_error");}//5.删除共享内存if(-1==shmctl(shmid,IPC_RMID,NULL)){ERRLOG("shmctl_error");}return 0;
}

02_memory_r.c

#include <25051head.h>
int main(int argc, const char *argv[])
{//1.创建秘钥key_t key;if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a'))){ERRLOG("ftok_error");}//2.创建共享内存int shmid=shmget(key,128,IPC_CREAT|0777);if(-1==shmid){ERRLOG("shmget_error");}//3.映射void* shmaddr=shmat(shmid,NULL,0);if((void*)-1==shmaddr){ERRLOG("shmat_error");}//读取共享内存的数据char* buf=(char*)shmaddr;printf("buf=[%s]\n",buf);while(1);
#if 0while(1){printf("buf=[%d]\n",buf);sleep(1);}
#endif//4.断开映射if(-1==shmdt(shmaddr)){ERRLOG("shmdt_error");}//5.删除共享内存if(-1==shmctl(shmid,IPC_RMID,NULL)){ERRLOG("shmctl_error");}return 0;
}

02.共享内存中引入同步互斥

04_memory_w.c

#include <25051head.h>
int main(int argc, const char *argv[])
{//1.创建秘钥key_t key;if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a'))){ERRLOG("ftok_error");}//02_01创建信号灯集和共享内存同用同一个秘钥int semid=semget(key,2,IPC_CREAT|0777);if(semid==-1){ERRLOG("semget_error");}//02_02如果信号灯集中的信号量不做初始化,默认结果为0//先查看一下每个信号量的值
#if 0unsigned short arr[2];if(-1==semctl(semid,200,GETALL,arr)){ERRLOG("semctl_error");}printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif//02_03把信号灯集中的两个信号量一个修改为0 一个修改为1unsigned short value[2]={0,1};semctl(semid,100,SETALL,value);#if 1unsigned short arr[2];if(-1==semctl(semid,200,GETALL,arr)){ERRLOG("semctl_error");}printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif//2.创建共享内存int shmid=shmget(key,128,IPC_CREAT|0777);if(-1==shmid){ERRLOG("shmget_error");}//3.映射void* shmaddr=shmat(shmid,NULL,0);if((void*)-1==shmaddr){ERRLOG("shmat_error");}while(1){//p(第二个信号);struct sembuf sops[2];//<0 申请信号量执行P操作 减运算sops[0].sem_num=1;sops[0].sem_op=-1;sops[0].sem_flg=0;if(-1==semop(semid,sops,1)){ERRLOG("semop_error");}char *buf=(char*)shmaddr;printf("请输入:");scanf("%s",buf);//v(第一个信号);sops[1].sem_num=0;sops[1].sem_op=1;sops[1].sem_flg=0;if(-1==semop(semid,sops+1,1)){ERRLOG("semop_error");}}//4.断开映射if(-1==shmdt(shmaddr)){ERRLOG("shmdt_error");}//02_06删除信号灯集if(-1==semctl(semid,300,IPC_RMID)){ERRLOG("semctl_error");}//5.删除共享内存if(-1==shmctl(shmid,IPC_RMID,NULL)){ERRLOG("shmctl_error");}return 0;
}

05_memory_r.c

#include <25051head.h>
int main(int argc, const char *argv[])
{//1.创建秘钥key_t key;if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a'))){ERRLOG("ftok_error");}//02_01创建信号灯集和共享内存同用同一个秘钥int semid=semget(key,2,IPC_CREAT|0777);if(semid==-1){ERRLOG("semget_error");}//2.创建共享内存int shmid=shmget(key,128,IPC_CREAT|0777);if(-1==shmid){ERRLOG("shmget_error");}//3.映射void* shmaddr=shmat(shmid,NULL,0);if((void*)-1==shmaddr){ERRLOG("shmat_error");}while(1){//读取共享内存的数据//p(第一信号);struct sembuf sops[2];//<0 申请信号量执行P操作 减运算sops[0].sem_num=0;sops[0].sem_op=-1;sops[0].sem_flg=0;if(-1==semop(semid,sops,1)){ERRLOG("semop_error");}char* buf=(char*)shmaddr;printf("buf=[%s]\n",buf);//v(第二个信号);	sops[1].sem_num=1;sops[1].sem_op=1;sops[1].sem_flg=0;if(-1==semop(semid,sops+1,1)){ERRLOG("semop_error");}}//4.断开映射if(-1==shmdt(shmaddr)){ERRLOG("shmdt_error");}//02_06删除信号灯集if(-1==semctl(semid,300,IPC_RMID)){ERRLOG("semctl_error");}//5.删除共享内存if(-1==shmctl(shmid,IPC_RMID,NULL)){ERRLOG("shmctl_error");}return 0;
}

03.共享内存且同步互斥(封装PV操作)

06_memory_w.c

#include <25051head.h>
int main(int argc, const char *argv[])
{//1.创建秘钥key_t key;if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a'))){ERRLOG("ftok_error");}//02_01创建信号灯集和共享内存同用同一个秘钥int semid=semget(key,2,IPC_CREAT|0664);if(semid==-1){ERRLOG("semget_error");}//02_02如果信号灯集中的信号量不做初始化,默认结果为0//先查看一下每个信号量的值
#if 0unsigned short arr[2];if(-1==semctl(semid,200,GETALL,arr)){ERRLOG("semctl_error");}printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif//02_03把信号灯集中的两个信号量一个修改为0 一个修改为1unsigned short value[2]={0,1};semctl(semid,100,SETALL,value);#if 1unsigned short arr[2];if(-1==semctl(semid,200,GETALL,arr)){ERRLOG("semctl_error");}printf("arr[0]=%d arr[1]=%d\n",arr[0],arr[1]);
#endif//2.创建共享内存int shmid=shmget(key,128,IPC_CREAT|0664);if(-1==shmid){ERRLOG("shmget_error");}//3.映射void* shmaddr=shmat(shmid,NULL,0);if((void*)-1==shmaddr){ERRLOG("shmat_error");}while(1){//p(第二个信号);//<0 申请信号量执行P操作 减运算//P(1,-1,semid);char *buf=(char*)shmaddr;printf("请输入:");scanf("%s",buf);//v(第一个信号);V(0,1,semid);	}//4.断开映射if(-1==shmdt(shmaddr)){ERRLOG("shmdt_error");}//5.删除共享内存if(-1==shmctl(shmid,IPC_RMID,NULL)){ERRLOG("shmctl_error");}//02_06删除信号灯集if(-1==semctl(semid,300,IPC_RMID)){ERRLOG("semctl_error");}return 0;
}

07_memory_r.c

#include <25051head.h>
int main(int argc, const char *argv[])
{//1.创建秘钥key_t key;if(-1==(key=ftok("/home/ubuntu/25041/linux/lj/day25_IO/",'a'))){ERRLOG("ftok_error");}//02_01创建信号灯集和共享内存同用同一个秘钥int semid=semget(key,2,IPC_CREAT|0664);if(semid==-1){ERRLOG("semget_error");}//2.创建共享内存int shmid=shmget(key,128,IPC_CREAT|0664);if(-1==shmid){ERRLOG("shmget_error");}//3.映射void* shmaddr=shmat(shmid,NULL,0);if((void*)-1==shmaddr){ERRLOG("shmat_error");}while(1){//读取共享内存的数据//p(第一信号);//<0 申请信号量执行P操作 减运算P(0,-1,semid);char* buf=(char*)shmaddr;printf("buf=[%s]\n",buf);//v(第二个信号);	V(1,1,semid);}//4.断开映射if(-1==shmdt(shmaddr)){ERRLOG("shmdt_error");}//5.删除共享内存if(-1==shmctl(shmid,IPC_RMID,NULL)){ERRLOG("shmctl_error");}//02_06删除信号灯集if(-1==semctl(semid,300,IPC_RMID)){ERRLOG("semctl_error");}return 0;
}

08_p_v.c

#include <25051head.h>
int P(int sem_num,int sem_op,int semid)
{struct sembuf sops[2];sops[0].sem_num=sem_num;sops[0].sem_op=sem_op;sops[0].sem_flg=0;if(-1==semop(semid,sops,1)){ERRLOG("semop_error");}}int V(int sem_num,int sem_op,int semid)
{struct sembuf sops[2];sops[1].sem_num=sem_num;sops[1].sem_op=sem_op;sops[1].sem_flg=0;if(-1==semop(semid,sops+1,1)){ERRLOG("semop_error");}}

04.生成静态库

05.生成动态库

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

相关文章:

  • 向量数据库是什么?技术体系:从理论到实践的深度解析(HNSW算法、Milvus、Weaviate、Qdrant、 Chroma)
  • Spring Security架构与实战全解析
  • 网络--初级
  • [Datawhale AI夏令营]大模型技术-基于带货视频评论的用户洞察挑战赛上分分享
  • 避免 Java double 科学计数法
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的供电公司安全生产考试管理系统,推荐!
  • django-ckeditor配置html5video实现视频上传与播放
  • MySQL数据库访问(C/C++)
  • Qt的第一个程序(2)
  • C++ -- string类的模拟实现
  • 单点登录SSO的演进和最佳实践,含springBoot 实现(Java版本)
  • .NET9 实现 JSON 序列化和反序列化(Newtonsoft.Json System.Text.Json)性能测试
  • 用c++做游戏开发至少要掌握哪些知识?
  • 合成生物学论坛|2025合成生物学期刊高质量发展论坛8月上海举办
  • 在线学堂-4.媒资管理模块(三)
  • 暑假算法日记第三天
  • D触发器实现2分频verilog及电路
  • 解决Android Studio不能同时打开多个文件问题
  • 微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
  • 2048-控制台版本
  • K8s-服务发布进阶
  • 分布式事务解决方案(二)
  • 电信、移动、联通、广电跨运营商网速慢原因
  • Linux国产与国外进度对垒
  • 408第三季part2 - 计算机网络 - 传输层
  • C++高频知识点(二)
  • std::vector<bool>有什么特殊的吗
  • 植物大战僵尸杂交重制版1.0,经典焕新,重燃策略塔防之火
  • 极简的神经网络反向传播例子
  • Vue计算属性(computed)全面解析:原理、用法与最佳实践