?? pv.c
字號:
#include <sys/mman.h>#include <sys/types.h>#include <linux/sem.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <errno.h>#include <time.h>#define BUFSIZE 20//聲明三個信量int fullid;int emptyid;int mutexid;int main(){ struct sembuf P,V; union semun arg; //生成信號量 fullid= semget(IPC_PRIVATE,1,IPC_CREAT|0666); emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666); mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666); //為信號量賦值 arg.val = 0; if(semctl(fullid , 0 , SETVAL , arg) == -1) perror("semctl setval error"); arg.val =BUFSIZE; if(semctl(emptyid , 0 ,SETVAL , arg) == -1) perror("semctl setval error"); arg.val = 1; if(semctl(mutexid , 0 ,SETVAL , arg) == -1) perror("setctl setval error"); //初始化P,V操作 V.sem_num=0; V.sem_op =1; V.sem_flg=SEM_UNDO; P.sem_num=0; P.sem_op =-1; P.sem_flg=SEM_UNDO; //定義共享內存 int shmid; int *buffer; int getid=0,setid=0; int *get; int *set; //創建并附接共享內存 shmid=shmget(IPC_PRIVATE,20*sizeof(int),0666|IPC_CREAT); buffer=(int*)shmat(shmid,0,0); setid=shmget(IPC_PRIVATE,sizeof(int),0666|IPC_CREAT); set=(int*)shmat(setid,0,0); getid=shmget(IPC_PRIVATE,sizeof(int),0666|IPC_CREAT); get=(int*)shmat(getid,0,0); int j=0; if(fork()==0 ) { if(fork()>0) //生產者A進程 { while( (*set) < 30) { semop(emptyid , &P ,1 ); semop(mutexid , &P , 1); buffer[*(set)%BUFSIZE] = (*set)+ 1; printf("生產者A放入%d\n", buffer[(*set)%BUFSIZE]); printf("當前緩沖區的內容為:"); for(j=0;j<20;j++) printf("%d ",buffer[j]); printf("\n\n"); (*set)++; semop(mutexid , &V , 1); semop(fullid , &V , 1); sleep(1); } wait(0);//等待子進程終止 wait(0); wait(0); shmdt(buffer);//斷開附接的共享內存 shmctl(shmid,IPC_RMID,0);//撤銷共享內存 shmdt(get);//斷開附接的消費者的共享內存 shmctl(getid,IPC_RMID,0);//斷開生產者共享內存 shmdt(set); shmctl(setid,IPC_RMID,0);//撤銷信號量集 semctl(emptyid,IPC_RMID,0); semctl(fullid,IPC_RMID,0); semctl(mutexid,IPC_RMID,0); printf("生產者A進程結束\n"); exit(0); } else //生產者B進程 { if(fork()>0) { while( (*set) < 30) { semop(emptyid , &P ,1 ); semop(mutexid , &P , 1); buffer[*(set)%BUFSIZE] = (*set) + 1; printf("生產者B放入%d\n", buffer[(*set)%BUFSIZE]); printf("當前緩沖區的內容為:"); for(j=0;j<20;j++) printf("%d ",buffer[j]); printf("\n\n"); (*set)++; semop(mutexid , &V , 1); semop(fullid , &V , 1); sleep(1); } printf("生產者B進程結束\n"); exit(0); } else { if(fork()>0) //消費者A進程 { while(1) { semop(fullid , &P , 1); semop(mutexid , &P , 1); if(*get == 30) break; printf("消費者A消費%d\n", buffer[(*get)%BUFSIZE] ); buffer[(*get)%BUFSIZE]=0; printf("當前緩沖區的內容為:"); for(j=0;j<20;j++) printf("%d ",buffer[j]); printf("\n\n"); (*get)++; semop(mutexid , &V , 1); semop(emptyid , &V ,1 ); sleep(1); } printf("消費者A進程結束\n"); exit(0); } else { //消費者B進程 while(1) { semop(fullid , &P , 1); semop(mutexid , &P , 1); if(*get == 30) break; printf("消費者B取出 %d\n",buffer[(*get)%BUFSIZE] ); buffer[(*get)%BUFSIZE]=0; printf("當前緩沖區的內容為:"); for(j=0;j<20;j++) printf("%d ",buffer[j]); printf("\n\n"); (*get)++; semop(mutexid , &V , 1); semop(emptyid , &V ,1 ); sleep(1); } printf("消費者B進程結束\n"); exit(0); } } } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -