Go to the documentation of this file.00001
00026 #include "sr_communications/ipc/semaphores.h"
00027
00029
00030 int createKey(key_t * semKey, char * semFile)
00031 {
00032 if (access(semFile, F_OK) != 0) {
00033 if (creat(semFile, 0777) == -1) {
00034 perror("createKey() - error creating file keys for semaphore\n");
00035 fprintf(stderr, "kcreateKey %s\n", semFile);
00036 return -1;
00037 }
00038 }
00039
00040 if ((*semKey = ftok(semFile, 'S')) < 0) {
00041 perror("createKey() - error ftok ");
00042 return -2;
00043 }
00044
00045 return (int) *semKey;
00046 }
00047
00049
00050 int getSemID(key_t semKey, int * semID)
00051 {
00052 *semID = semget(semKey, 1, IPC_CREAT | 0777);
00053 if (*semID == -1) {
00054 perror("error semget");
00055 return -1;
00056 }
00057
00058 if (semctl(*semID, 0, SETVAL, 1) < 0) {
00059 perror("error semctl");
00060 return -2;
00061 }
00062
00063 return (int) *semID;
00064 }
00065
00067
00068 int rmSem(int semID)
00069 {
00070 struct sembuf arg[] = {0,
00071 0,
00072 0};
00073
00074 if (semctl(semID, 0, IPC_RMID, arg) < 0) {
00075 perror("rmSem() - error semctl");
00076 return -1;
00077 }
00078
00079 return 0;
00080 }
00081
00083
00084 int waitSem(int semID)
00085 {
00086 struct sembuf opIn[] = {0,
00087 -1,
00088 0};
00089
00090
00091
00092 if (semop(semID, opIn, 1) < 0) {
00093 perror("waitSem() - error semop");
00094 return -1;
00095 }
00096
00097 return 0;
00098 }
00099
00101
00102 int freeSem(int semID)
00103 {
00104 struct sembuf opOut[] = {0,
00105 1,
00106 0};
00107
00108 if (semop(semID, opOut, 1) < 0) {
00109 perror("freeSem() - error semop");
00110 return -1;
00111 }
00112
00113 return 0;
00114 }
00115