|
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/sem.h>
- #include <sys/ipc.h>
- #define NUM 5
- #define TIMES 2
- union semun {
- int val;
- struct semid_ds *buf;
- ushort *array;
- };
- P(int sem,int x,int y)
- {
- int num1,num2,i=TIMES;
- struct sembuf lacquire={sem,-1,SEM_UNDO};
- struct sembuf racquire={sem,-1,SEM_UNDO};
- struct sembuf lrelease={sem,1,SEM_UNDO};
- struct sembuf rrelease={sem,1,SEM_UNDO};
- lacquire.sem_num=(x+4)%5;
- racquire.sem_num=y%5;
- lrelease.sem_num=(x+4)%5;
- rrelease.sem_num=y%5;
- for(i=0;i<NUM;i++)
- {
- if((num1=semctl(sem,x,GETVAL),0)==-1)
- {perror("semctl");exit(3);}
- if((num2=semctl(sem,y,GETVAL),0)==-1)
- {perror("semctl");exit(3);}
- if(num1&&num2)
- {
- printf("The No.%d philosopher is eating!\n",x);
- if(semop(sem,&racquire,1)==-1)
- {perror("semop");exit(5);}
- if(semop(sem,&lacquire,1)==-1)
- {perror("semop");exit(5);}
- sleep(1);
- if(semop(sem,&lrelease,1)==-1)
- {perror("semop");exit(6);}
- if(semop(sem,&rrelease,1)==-1)
- {perror("semop");exit(6);}
- }
- else
- {
- printf("The No.%d philosopher is thinking!\n",x);
- continue;
- }
- }
- }
- main()
- {
- key_t ipc_key;
- struct semid_ds sem_buf;
- int sem,i;
- union semun arg;
- int *p,*pid,cpid;[color=red]
- //这里要是改成int *p,*pid,cpid;union semun arg;就则出现:段错误
- //以前看过一个堆栈生长的贴子,但还不明白当变量是指针时,要压入什么到栈里
- [/color]ushort sem_array[5]={1,1,1,1,1};
- *pid=getpid();//get the pid of the parent prodecure
- p=pid;
- arg.array=sem_array;
- ipc_key=ftok(".",'c');
- if((sem=semget(ipc_key,NUM,IPC_CREAT))==-1)
- {perror("semget");exit(1);}
- if(semctl(sem,NUM,SETALL,arg)==-1)
- {perror("semctl SETALL");exit(2);}
- /*for(i=0;i<NUM;i++)
- {
- if((cpid=semctl(sem,i,GETVAL,0))==-1)
- {perror("semctl GETVAL");exit(8);}
- printf("%5d",cpid);
- } */
- for(i=1;i<NUM+1;i++)
- {
- if((cpid=fork())==-1)
- {
- perror("fork error!");
- exit(1);
- }
- else
- if(cpid==0)
- {
- *(pid+i)=getpid();
- break;
- }
- else
- continue;
- }
- for(i=1;i<NUM+1;i++)
- {
- cpid=getpid();
- if(cpid==*(p+i))
- {
- P(sem,i,i+1);
- }
- else
- continue;
- }
- }
复制代码 |
|