Linux下共享内存+信号量实现
2014-05-24 17:07
302 查看
![](http://images.cnitblog.com/i/609049/201405/242128413568475.png)
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两个头文件位置的选择,否则会出现错误。
相关文章推荐
- Linux下用信号量实现对共享内存的访问保护
- Linux下用信号量实现对共享内存的访问保护
- Linux进程间通信之共享内存+信号量
- Linux进程间通信 共享内存+信号量+简单例子
- Linux进程间通信 共享内存+信号量+简单样例
- Linux下用信号量实现对共享内存的访问保护(一)
- Linux进程间通信 共享内存+信号量+简单例子
- Linux下利用信号量函数和共享内存函数和C语言实现生产者消费者问题
- Linux之用信号量实现的共享内存机制
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- linux基于信号量同步的共享内存IPC实现
- linux进程通信(一)--共享内存+信号量,代码示例
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- windows与linux实现共享
- 如何在windows和、Unix/linux之间实现文件共享
- 分析linux共享内存的实现
- Linux下两个远程登陆用户如何共享同一个登陆shell,以实现远程教育或远程协助
- 实现在WINDOWS中访问LINUX共享资源
- VMware(装linux)与主机文件共享实现