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 0
while(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 0
while(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 0
unsigned 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 一个修改为1
unsigned short value[2]={0,1};
semctl(semid,100,SETALL,value);
#if 1
unsigned 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 0
unsigned 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 一个修改为1
unsigned short value[2]={0,1};
semctl(semid,100,SETALL,value);
#if 1
unsigned 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.生成动态库