1 #define _GNU_SOURCE 2 3 #include <config.h> 4 #include <errno.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <sys/ipc.h> 8 #include <sys/sem.h> 9 #include <time.h> 10 int main(int argc, char **argv) 11 { 12 int semid; 13 struct sembuf sop; 14 #ifdef HAVE_SEMTIMEDOP 15 struct timespec ts; 16 #endif 17 18 if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0) 19 { 20 perror("semget"); 21 exit(1); 22 } 23 24 sop.sem_num = 0; 25 sop.sem_op = 1; 26 sop.sem_flg = 0; 27 28 if (semop(semid, &sop, 1) < 0) 29 { 30 perror("semop"); 31 semctl(semid, 0, IPC_RMID); 32 exit(1); 33 } 34 35 /* The next call to semtimedop causes the program to hang on 36 ppc32-linux (Yellow Dog 4.0). I don't know why. Hence the 37 extended ifdef. */ 38 #if defined(HAVE_SEMTIMEDOP) && !defined(__powerpc__) 39 sop.sem_num = 0; 40 sop.sem_op = 0; 41 sop.sem_flg = 0; 42 43 ts.tv_sec = 0; 44 ts.tv_nsec = 1000000; 45 46 if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN) 47 { 48 perror("semtimedop"); 49 semctl(semid, 0, IPC_RMID); 50 exit(1); 51 } 52 #endif 53 54 sop.sem_num = 0; 55 sop.sem_op = -1; 56 sop.sem_flg = 0; 57 58 if (semop(semid, &sop, 1) < 0) 59 { 60 perror("semop"); 61 semctl(semid, 0, IPC_RMID); 62 exit(1); 63 } 64 65 #ifdef HAVE_SEMTIMEDOP 66 sop.sem_num = 0; 67 sop.sem_op = 0; 68 sop.sem_flg = 0; 69 70 ts.tv_sec = 0; 71 ts.tv_nsec = 1000; 72 73 if (semtimedop(semid, &sop, 1, &ts) < 0) 74 { 75 perror("semtimedop"); 76 semctl(semid, 0, IPC_RMID); 77 exit(1); 78 } 79 #endif 80 81 if (semctl(semid, 0, IPC_RMID) < 0) 82 { 83 perror("semctl(IPC_RMID)"); 84 exit(1); 85 } 86 87 exit(0); 88 } 89