#define _GNU_SOURCE #include <config.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/sem.h> #include <time.h> #include <unistd.h> int main(int argc, char **argv) { int semid; struct sembuf sop; #ifdef HAVE_SEMTIMEDOP struct timespec ts; #endif if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0) { perror("semget"); exit(1); } sop.sem_num = 0; sop.sem_op = 1; sop.sem_flg = 0; if (semop(semid, &sop, 1) < 0) { perror("semop"); semctl(semid, 0, IPC_RMID); exit(1); } if (semctl(semid, 0, GETVAL) != 1) { perror("semctl GETVAL"); semctl(semid, 0, IPC_RMID); exit(1); } if (semctl(semid, 0, GETPID) != getpid()) { perror("semctl GETPID"); semctl(semid, 0, IPC_RMID); exit(1); } /* The next call to semtimedop causes the program to hang on ppc32-linux (Yellow Dog 4.0). I don't know why. Hence the extended ifdef. */ #if defined(HAVE_SEMTIMEDOP) && !defined(__powerpc__) sop.sem_num = 0; sop.sem_op = 0; sop.sem_flg = 0; ts.tv_sec = 0; ts.tv_nsec = 1000000; if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN) { perror("semtimedop"); semctl(semid, 0, IPC_RMID); exit(1); } #endif sop.sem_num = 0; sop.sem_op = -1; sop.sem_flg = 0; if (semop(semid, &sop, 1) < 0) { perror("semop"); semctl(semid, 0, IPC_RMID); exit(1); } #ifdef HAVE_SEMTIMEDOP sop.sem_num = 0; sop.sem_op = 0; sop.sem_flg = 0; ts.tv_sec = 0; ts.tv_nsec = 1000; if (semtimedop(semid, &sop, 1, &ts) < 0) { perror("semtimedop"); semctl(semid, 0, IPC_RMID); exit(1); } #endif if (semctl(semid, 0, IPC_RMID) < 0) { perror("semctl(IPC_RMID)"); exit(1); } exit(0); }