//comm.c
#include"comm.h" int commSem(int num,int flags) { int semid; key_t _key=ftok(PATHNAME,PROJ_ID); if(_key<0) { perror("ftok"); return -1; } if((semid=semget(_key,num,flags))<0) { perror("semget"); return -2; } return semid; } int creatSem(int num) { return commSem(num,IPC_CREAT|IPC_EXCL|0666); } int initSem(int semid,int semnum,int value) { union semun un; un.val=value; if(semctl(semid,semnum,SETVAL,un)<0) { perror("init _semctl"); return -3; } return 0; } int getSem(int num) { return commSem(num,IPC_CREAT); } int destorySem(int semid) { if(semctl(semid,0,IPC_RMID)<0) { perror("destory _semid"); return -3; } return 0; } int operatSem(int semid,int op) { struct sembuf buf; buf.sem_num=0; buf.sem_op=op; buf.sem_flg=0; int oop=semop(semid,&buf,1); if(oop<0) { perror("semop"); return -4; } } int P(int semid) { operatSem(semid,-1); } int V(int semid) { operatSem(semid,1); } //test.c #include"comm.h" int main() { int semid=creatSem(1); initSem(semid,0,1); pid_t id=fork(); if(id<0) { perror("fork()"); return 5; } else if(id==0) {//child int semid=getSem(1); P(semid); int count=0; while(count++<5) { // sleep(1); printf("A\n"); sleep(1); printf("A\n"); } V(semid); // exit(0); } else {//father P(semid); int count=0; while(count++<5) { sleep(1); printf("B\n"); sleep(1); printf("B\n"); } V(semid); waitpid(id,NULL,0); } destorySem(semid); return 0; }