康复医学与理疗学就业:实验 信号量实现进程同步

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 21:53:50
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSEM 5
 
/*声明3个信号量ID*/
 int fullid;
 int emptyid;
 int mutxid;
 
 int main(){
 struct sembuf P,V;
 union semun arg;
 /* 声明共享主存*/
 int *array;
 int *sum;
 int *set;
 int *get;
 /*将array、sum、set和 get映射到共享主存*/
 array=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int)*MAXSEM,IPC_CREAT|0666),0,0);
 sum=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
 set=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
 get=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
 *get=0;
 /* 创建信号量*/
fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
 
 /* 为信号量赋值*/
 arg.val=0;
 if(semctl(fullid,0,SETVAL,arg)==-1) perror("semctl setval error");
 arg.val=MAXSEM;
 if(semctl(emptyid,0,SETVAL,arg)==-1) perror("semctl setval error");
 arg.val=1;
 if(semctl(mutxid,0,SETVAL,arg)==-1) perror("semctl setval error");
 
 /*初始化P、V操作*/
 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;
 
 /* 创建生产者进程*/
 if(fork()==0){
  int i=0;
  *set=0;
  while(i<10){
   semop(emptyid,&P,1);
   semop(mutxid,&P,1);
    
   array[(*set)%MAXSEM]=i+1;
   //printf("Producer put number %d to No.%d\n",array[(*set)%MAXSEM],(*set)%MAXSEM);
   (*set)++;
    
   semop(mutxid,&V,1);         //对mutxid执行 V 操作
   semop(fullid,&V,1);          //对fullid执行 V 操作
   i++;
  }
  sleep(3);
  printf("生产者结束");
  exit(0);
  }else{
   /* 创建消费者进程A*/
   if(fork()==0){
    while(1){
     semop(fullid,&P,1);        //对fullid执行 P 操作
     semop(mutxid,&P,1);       //对mutxid执行 P 操作
 
     if(*get==10)
     break;
     (*sum)+=array[(*get)%MAXSEM];
     printf("The ComsumerA Get Number %d\n",array[(*get)%MAXSEM]);
     (*get)++;
     if(*get==10)
     printf("The sum is %d\n",*sum);
     semop(mutxid,&V,1);
     semop(emptyid,&V,1);
     sleep(1);
      
    }
    printf(" 消费者A结束");
    exit(0);  
   }else{
   /*创建消费者进程B*/
   if(fork()==0){
    while(1){
     semop(fullid,&P,1);        //对fullid执行 P 操作
     semop(mutxid,&P,1);       //对mutxid执行 P 操作
 
     if(*get==10)
     break;
     (*sum)+=array[(*get)%MAXSEM];
     printf("The ComsumerB Get Number %d\n",array[(*get)%MAXSEM]);
     (*get)++;
     if(*get==10)
     printf("The sum is %d\n",*sum);
     semop(mutxid,&V,1);
     semop(emptyid,&V,1);
     sleep(1);
      
    }
    printf(" 消费者B结束");
    exit(0);
  }
   
 }
 }

 /*   父进程返回后回收3个子进程 */
wait(0);
wait(0);
wait(0);


/*   撤消3个信号量集 */
semctl(emptyid,IPC_RMID,0);
semctl(fullid,IPC_RMID,0);
semctl(mutxid,IPC_RMID,0);
exit(0);
 }