#include #include #include #include "pv.h" initsem(semkey) key_t semkey; { int status = 0, semid; if((semid = semget(semkey, 1, SEMPERM|IPC_CREAT|IPC_EXCL))==-1) if(errno == EEXIST) semid = semget(semkey,1,0); else status = semctl(semid,0,SETVAL,1); if(semid == -1 || status == -1) { perror("initsem failed"); return(-1); } else { printf("calling v(%d) for pid=any\n",semid); v(semid); return semid; } } p(semid) int semid; { struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = SEM_UNDO; if(semop(semid, &p_buf, 1) == -1) { perror("p(semid) failed"); exit(1); } else return(0); } v(semid) int semid; { struct sembuf v_buf; v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = SEM_UNDO; if(semop(semid, &v_buf, 1) == -1) { perror("v(semid) failed"); exit(1); } else return(0); }