1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <sys/sem.h> #include <sys/ipc.h> #include <errno.h> ...
int main(int argc, char const *argv[]) { key_t key = ftok(".", 0x01); if (key < 0) { LOG_ERROR("ftok failed, key %d", key); return -1; }
int semId = semget(key, 1, IPC_CREAT | 0600); if (semId == -1) { LOG_ERROR("semget failed, %d, %s", errno, strerror(errno)); return -1; }
int code = semctl(semId, 0, SETVAL, 1); if (code == -1) { LOG_ERROR("semctl failed, %d, %s", errno, strerror(errno)); return -1; }
while ((pid = fork()) == -1);
while (1) { struct sembuf signal; signal.sem_op = -1; signal.sem_flg = SEM_UNDO; signal.sem_num = 0; code = semop(semId, &signal, 1); if (code == -1) { LOG_ERROR("semop failed, %d, %s", errno, strerror(errno)); return -1; } ... signal.sem_op = 1; code = semop(semId, &signal, 1); if (code == -1) { LOG_ERROR("semop failed, %d, %s", errno, strerror(errno)); return -1; } }
if (pid != 0) { ... int code = semctl(semId, 0, IPC_RMID); if (code == -1) { LOG_ERROR("semctl failed, %d, %s", errno, strerror(errno)); return -1; } } else { ... }
return 0; }
|