// File; testSemUNDO.c // See if the system has SEMUNDO implemented // SEMUNDO will reverse the effect of a P() (wait) operation if // process that successfully issued it crashes. // This protects a system from unbounded waiting #include #include #include #include #include #include #include #include #include #include #include #define NumSems 1 void PrintSems(int semid); // Issues a wait() with SEMUNDO void P(key_t semID,int semNum); // Issue a signal() void V(key_t semID,int semNum); int main() { key_t semKey=getuid(); int semID; if ((semID = semget(semKey, 1, 0))<0) { semID = semget(semKey, 1, 0666|IPC_CREAT); V(semID,0); PrintSems(semID); } P(semID,0); printf("Process %d is in! \n ",getpid()); // Tried to just have a read but the suspension was a problem // I assume a possibkly indefinite suspension is detected printf("Will sleep for 10 seconds so you can test SEM_UNDO\n"); sleep(10); V(semID,0); } void PrintSems(semid) int semid; {int i; ushort Values[NumSems]; semctl(semid,0,GETALL,Values); fprintf(stderr,"Semaphore Values "); for (i=0;i