Linux system V IPC 信号灯和共享内存实例:#include<sys/types.h> #include<linux/sem.h> #include<linux/shm.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<time.h> #define MAXSHM 5 //定义缓冲区数组的下标变量个数/* 定义3个信号量的内部标识 */int fullid; int emptyid; int mutexid;/* 主函数 */int main() { /* 定义2个共享内存的ID */ int arrayid; int getid; /* 定义共享内存虚拟地址 */ int *array; int *get; /* 创建共享内存 */
printf("Producer put number %d to No.%d
",array[set%MAXSHM],set%MAXSHM); set++; //写计数加1 semop(mutexid,&V,1); //对mutexid执行 V 操作 semop(fullid,&V,1); //对fullid执行 V 操作 i++; } sleep(3); //SLEEP 3秒,等待消费者进程执行完毕 printf("Poducer if over
"); exit(0); } else { /* 消费者A进程 */ if(fork()==0) { while(1) { if(*get==10) { break; }
semop(fullid,&P,1); //对fullid执行 P 操作 semop(mutexid,&P,1); //对mutexid执行 P 操作 printf("The ConsumerA get number from No.%d
",(*get)%MAXSHM);
(*get)++; //读计数加1 semop(mutexid,&V,1); //对mutexid执行 V 操作 semop(emptyid,&V,1); //对fullid执行 V 操作 sleep(1); }
printf("ConsunerA is over
"); exit(0); } else { /*消费者B进程 */ if(fork()==0) { while(1) { if(*get==10) { break; } semop(fullid,&P,1); //对fullid执行 P 操作 semop(mutexid,&P,1); //对mutexid执行 P 操作 printf("The ConsumerB get number from No.%d
",(*get)%MAXSHM); (*get)++; //读计数加1 semop(mutexid,&V,1); //对mutexid执行 V 操作 semop(emptyid,&V,1); //对emptyid执行 V 操作
sleep(1); }
printf("ConsunerB is over
"); exit(0); } } } /* 父进程返回后回收3个子进程 */