- A 往共享内存中写 ,B从共享内存中读(一次读一个)
思考:
得加锁,不然A 写了 B 一直在读取,结束不了,只有在A进程结束时 ,B才结束。
所以应该设置两个信号量,控制AB的写和读
shma.c
#include#include #include #include #include #include #include"sem.h" int main() { int shmid = shmget((key_t)1234,128,IPC_CREAT|0600); assert(shmid != -1); char* s= (char*) shmat(shmid,NULL,0); sem_init(); while(1) { printf("input:n"); char buff[128] ={0}; fgets(buff,128,stdin); sem_p(SEM1); strcpy(s,buff);//xianggongxiangneicunxierushuju sem_v(SEM2); if(strncmp(buff,"end",3)==0) { break; } } shmdt(s); }
shmb.c
#include#include #include #include #include #include #include"sem.h" int main() { int shmid = shmget((key_t)1234,128,IPC_CREAT|0600); assert(shmid != -1); char* s= (char*) shmat(shmid,NULL,0); sem_init(); while(1) { sem_p(SEM2); if(strncmp(s,"end",3) == 0) { break; } printf("read:%sn",s); sem_v(SEM1); } shmdt(s); sem_destory(); }
sem.h
#include#include #include #include #include #define SEM_NUM 2 #define SEM1 0 #define SEM2 1 //#define SEM3 2 union semun { int val; }; int sem_init(); void sem_p(int index); void sem_v(int index); void sem_destory();
sem.c
#include"sem.h"
static int semid = -1;
int sem_init()
{
semid = semget((key_t)1234,SEM_NUM,IPC_CREAT|IPC_EXCL|0600);
if(semid == -1)
{
semid = semget((key_t)1234,SEM_NUM,0600);
if(semid == -1)
{
printf("semget errn");
return -1;
}
}
else
{
int arr[SEM_NUM] = {1,0};
for(int i = 0;i= SEM_NUM)
{
return ;
}
struct sembuf buf;
buf.sem_num = index ;
buf.sem_op = -1;//p
buf.sem_flg = SEM_UNDO;
if( semop(semid,&buf,1) == -1)
{
return ;
}
}
void sem_v(int index)
{
if(index <0 || index >= SEM_NUM)
{
return ;
}
struct sembuf buf;
buf.sem_num = index ;
buf.sem_op =1;//v
buf.sem_flg = SEM_UNDO;
if(semop(semid,&buf,1) == -1)
{
return ;
}
}
void sem_destory()
{
if(semctl(semid,0,IPC_RMID) == -1)
{
return ;
}
}



