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