sem.c revision e739ac0589b4fb43561f801c4faba8c1b89f8680
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> 10int 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