您的位置:首页 > 运维架构 > Linux

Linux下共享内存+信号量实现

2014-05-24 17:07 302 查看


sem1.c

#include"unistd.h"
#include"string.h"
#include"stdio.h"
#include"stdlib.h"
#include"linux/types.h"
#include"linux/sem.h"
#include"linux/ipc.h"
#include"linux/shm.h"
#include"error.h"
int main()
{
key_t sem_key1=10086,sem_key2=10087,shm_key=10088;
int mutexid1,mutexid2;
int shmid=0,count=0,*addr,j=0,temp=0;
union semun arg1,arg2;
struct sembuf P,V;
/* define  P   V operation*/
P.sem_num=0;
P.sem_op=-1;
P.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;
arg1.val=4;
arg2.val=0;

mutexid1=semget(sem_key1,1,0666|IPC_CREAT);
mutexid2=semget(sem_key2,1,0666|IPC_CREAT);
semctl(mutexid1,0,SETVAL,arg1);
semctl(mutexid2,0,SETVAL,arg2);

shmid=shmget(shm_key,sizeof(int)*7,IPC_CREAT|0600);
addr=(int *)shmat(shmid,NULL,0);//init share memory
*(addr)=3;
*(addr+1)=3;
*(addr+2)=0;
shmdt(addr);
printf("         TIPS: iput\"-1\" to stop input num.\n\n");
while(1)
{

/**************************************************/

semop(mutexid1,&P,1);

shmid=shmget(shm_key,sizeof(int)*7,IPC_CREAT|0600);
addr=(int *)shmat(shmid,NULL,0);//init share memory
j=*(addr+1);
count=*(addr+2);
if(j==7)j=3;

printf("Please input data:  ");
scanf("%d",&temp);
printf("\n");
*(addr+j)=temp;
printf("%d   wrrite sucess.\n\n",*(addr+j));
if(*(addr+j)==-1)
{
shmdt(addr);
semop(mutexid2,&V,1);
return 0;
}
j++;
count++;
*(addr+1)=j;
*(addr+2)=count;
shmdt(addr);

semop(mutexid2,&V,1);

/**************************************************/
}
return 0;
}


sem2.c

#include"unistd.h"
#include"stdio.h"
#include"stdlib.h"
#include"linux/types.h"
#include"linux/sem.h"
#include"linux/ipc.h"
#include"linux/shm.h"
#include"error.h"
int main()
{
key_t sem_key1=10086,sem_key2=10087,shm_key=10088;
int mutexid1,mutexid2;
int shmid=0,count=0,*addr,i=0;
union semun arg;
struct sembuf P,V;
/* define  P   V operation*/
P.sem_num=0;
P.sem_op=-1;
P.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;

mutexid1=semget(sem_key1,1,0666|IPC_CREAT);
mutexid2=semget(sem_key2,1,0666|IPC_CREAT);

while(1)
{

/***********************************************/

semop(mutexid2,&P,1);

shmid=shmget(shm_key,sizeof(int)*7,IPC_CREAT|0600);
addr=(int *)shmat(shmid,NULL,0);//init share memory
i=*(addr);
count=*(addr+2);
if(i==7)i=3;

printf("Read  data....   ");
printf("%d\n",*(addr+i));
if(*(addr+i)==-1)
{
shmdt(addr);
shmctl(shmid,IPC_RMID,NULL);
semctl(mutexid1,0,IPC_RMID,0);
semctl(mutexid2,0,IPC_RMID,0);
return 0;
}
i++;
count--;
*(addr)=i;
*(addr+2)=count;
shmdt(addr);

semop(mutexid1,&V,1);
}
/***********************************************/
return 0;
}


在gcc下需要注意Linux和sys两个头文件位置的选择,否则会出现错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: