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

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.dtcms.com/a/270377.html

相关文章:

  • TensorFlow 和PyTorch的全方位对比和选择建议
  • Latex几种常用的花体
  • [2-02-02].第04节:环境搭建 - Linux搭建ES集群环境
  • [RPA] 影刀RPA基本知识
  • Kafka多组消费:同一Topic,不同Group ID
  • NV298NV312美光固态闪存NW639NW640
  • 基于mysqlfrm工具解析mysql数据结构文件frm表结构和数据库版本信息
  • 【Nginx】Nginx代理WebSocket
  • 扣子Coze远程连接数据库插件
  • C语言基础(1)
  • 【C++】AVL树底层思想 and 大厂面试
  • Python 的内置函数 slice
  • 为什么elementui的<el-table-column label=“名称“ prop=“name“ label不用写成:label
  • RS-232协议与RS485协议详解
  • [Backlog] 命令行界面CLI vs Web界面及服务端
  • 快手电商要投入多少钱?快手电商入驻条件和费用
  • 分布式无线工业数据采集终端应用场景简析
  • POI报表
  • Paimon本地表查询引擎LocalTableQuery详解
  • Mybits-plus 表关联查询,嵌套查询,子查询示例演示
  • 使用策略模式 + 自动注册机制来构建旅游点评系统的搜索模块
  • 音频被动降噪技术
  • Spring AI:ETL Pipeline
  • STM32-USART
  • 图像噪点消除:用 OpenCV 实现多种滤波方法
  • jmeter 性能测试步骤是什么?
  • 【深度学习新浪潮】什么是上下文长度?
  • MQTT QoS 2 详细流程解析
  • 爬虫-request处理POST
  • pytorch深度学习-ResNet残差网络-CIFAR-10