00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00068 #ifndef DISABLE_IPC
00069
00070 #include <stdio.h>
00071 #include <stdlib.h>
00072 #include <stdbool.h>
00073 #include <string.h>
00074 #include <sys/shm.h>
00075 #include "qDecoder.h"
00076
00087 int qShmInit(const char *keyfile, int keyid, size_t size, bool ifexistdestroy) {
00088 key_t semkey;
00089 int shmid;
00090
00091
00092 if(keyfile != NULL) {
00093 semkey = ftok(keyfile, keyid);
00094 if (semkey == -1) return -1;
00095 } else {
00096 semkey = IPC_PRIVATE;
00097 }
00098
00099
00100 if ((shmid = shmget(semkey, size, IPC_CREAT | IPC_EXCL | 0666)) == -1) {
00101 if(ifexistdestroy == false) return -1;
00102
00103
00104 if((shmid = qShmGetId(keyfile, keyid)) >= 0) qShmFree(shmid);
00105 if ((shmid = shmget(semkey, size, IPC_CREAT | IPC_EXCL | 0666)) == -1) return -1;
00106 }
00107
00108 return shmid;
00109 }
00110
00119 int qShmGetId(const char *keyfile, int keyid) {
00120 int shmid;
00121
00122
00123 key_t semkey = ftok(keyfile, keyid);
00124 if (semkey == -1) return -1;
00125
00126
00127 if ((shmid = shmget(semkey, 0, 0)) == -1) return -1;
00128
00129 return shmid;
00130 }
00131
00139 void *qShmGet(int shmid) {
00140 void *pShm;
00141
00142 if (shmid < 0) return NULL;
00143 pShm = shmat(shmid, 0, 0);
00144 if(pShm == (void *)-1) return NULL;
00145 return pShm;
00146 }
00147
00155 bool qShmFree(int shmid) {
00156 if (shmid < 0) return false;
00157 if (shmctl(shmid, IPC_RMID, 0) != 0) return false;
00158 return true;
00159 }
00160
00161 #endif