| 发表于:2007-12-04 17:23:273楼 得分:0 |
附个源代码,大家看看。 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <stdio.h> #include <sys/shm.h> #define key (key_t) 105 #define key2 (key_t) 108 #define max_buffer_size 10 union semun{ int val; struct semid_ds *buf; ushort *array; }; typedef struct _tagsharebuffer{ int buffer[max_buffer_size]; int writer; int reader; }sharebuffer; int main() { int shmid; char* shmptr; sharebuffer* psharebuffer; int product=0; int semid; struct sembuf mutex,empty,full; int i; if((semid=semget(key,3,ipc_creat ¦0660))==-1) { printf("semget error!\n"); return -1; } union semun arg[3]; arg[0].val=1; arg[1].val=max_buffer_size; arg[2].val=0; for(i=0;i <3;i++) semctl(semid,i,setval,arg[i]); for(i=0;i <3;i++) printf("the semval(%d)=%d\n",i,semctl(semid,i,getval,null)); if((shmid=shmget(ipc_private,sizeof(sharebuffer),0600)) <0) { printf("shmget error!\n"); return -1; } if((shmptr=(char*)shmat(shmid,0,0))==(void*)-1) { printf("shmat error!\n"); return -1; } memset((void*)shmptr,0,sizeof(sharebuffer)); psharebuffer=(sharebuffer*)shmptr; int childpid=fork(); if(childpid==-1) { printf("create process error!"); return -1; } if(childpid==0) { while(1) { empty.sem_num=1; empty.sem_op=-1; empty.sem_flg=0; semop(semid,&empty,1); psharebuffer-> buffer[psharebuffer-> writer]=product; for(i=0;i <3;i++) printf("the semval(%d)=%d\n",i,semctl(semid,i,getval,null)); printf("produced the product into buffer[%d]=%d;\n",psharebuffer-> writer,product); product++; mutex.sem_num=0; mutex.sem_op=-1; mutex.sem_flg=0; semop(semid,&mutex,1); psharebuffer-> writer=(psharebuffer-> writer+1)%max_buffer_size; mutex.sem_num=0; mutex.sem_op=1; mutex.sem_flg=0; semop(semid,&mutex,1); full.sem_num=2; full.sem_op=1; full.sem_flg=0; semop(semid,&full,1); sleep(1); } } else { while(1) { sleep(5); full.sem_num=2; full.sem_op=-1; full.sem_flg=0; semop(semid,&full,1); product=psharebuffer-> buffer[psharebuffer-> reader]; for(i=0;i <3;i++) printf("the semval(%d)=%d\n",i,semctl(semid,i,getval,null)); printf("consumed the product from buffer[%d]=%d;\n",psharebuffer-> reader,product); product--; mutex.sem_num=0; mutex.sem_op=-1; mutex.sem_flg=0; semop(semid,&mutex,1); psharebuffer-> reader=(psharebuffer-> reader+1)%max_buffer_size; mutex.sem_num=0; mutex.sem_op=1; mutex.sem_flg=0; semop(semid,&mutex,1); empty.sem_num=1; empty.sem_op=1; empty.sem_flg=0; semop(semid,&empty,1); } } return 0; } | | |
|