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.生成动态库