📄 lc_sem.c
字号:
/* * Copyright (C) 2002 Ricardo Arroyo <ricardo.arroyo@eresmas.net> * * This code may be used under the terms of Version 2 of the GPL, * read the file COPYING for details. * */#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include "lc_debug.h"#include "lc_sem.h"/*__________________________________________________________________________*//* FUNCTION iCreateSem (key_t SemKey) *//* DESCRIPTION Creates and unblocks a semaphore with key SemKey *//* *//* INPUT PARAMETERS semKey Key *//* *//* OUTPUT PARAMETERS sem_id (semaphore identifier) or -1 in error *//* *//*__________________________________________________________________________*/int iCreateSem(key_t SemKey){int sem_id;struct sembuf sops; if ((sem_id = semget(SemKey, 1, 0666 | IPC_CREAT)) == -1) { fprintf(stderr,"iCreateSem/semget : Key = %d, errno = %d, %s\n",SemKey, errno, strerror(errno)); sem_id = -1; } // unblocks semaphore incrementing value sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0; if (semop(sem_id, &sops, 1) == -1) { fprintf(stderr,"iCreateSem/unlock : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno)); sem_id = -1; } if (iDebug & DEP_SEM) { fprintf(stderr,"iCreateSem : sem_id = %d, Key = %d\n",sem_id, SemKey); } return(sem_id);}/*__________________________________________________________________________*//* FUNCTION iAssignSem (key_t SemKey) *//* DESCRIPTION Assigns a semaphore identified by key SemKey *//* *//* INPUT PARAMETERS semKey Key *//* *//* OUTPUT PARAMETERS sem_id (semaphore identifier) or -1 in error *//* *//*__________________________________________________________________________*/int iAssignSem(key_t SemKey){int sem_id; if ((sem_id = semget(SemKey, 1, 0666)) == -1) { fprintf(stderr,"iAssignSem/semget : Key = %d, errno = %d, %s\n",SemKey, errno, strerror(errno)); sem_id = -1; } if (iDebug & DEP_SEM) { fprintf(stderr,"iAssignSem : sem_id = %d, Key = %d\n",sem_id, SemKey); } return(sem_id);}/*__________________________________________________________________________*//* FUNCTION iUnlockSem (int sem_id) *//* DESCRIPTION Unlocks a semaphore *//* *//* INPUT PARAMETERS sem_id: semaphore identifier *//* *//* OUTPUT PARAMETERS 0: OK, -1 error *//* *//*__________________________________________________________________________*/int iUnlockSem(int sem_id){int iRetValue; // return valuestruct sembuf sops; // semaphore operatios structureint res; sops.sem_num = 0; sops.sem_op = 1; // unlocks semaphore sops.sem_flg = SEM_UNDO; //undo if process terminates or dies if ((res = semop(sem_id, &sops, 1)) == -1) { fprintf(stderr,"iUnlockSem : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno)); iRetValue = -1; } else { iRetValue = 0; } if (iDebug & DEP_SEM) { fprintf(stderr,"iUnlockSem : sem_id = %d res = %d\n",sem_id,res); } return(iRetValue);}/*__________________________________________________________________________*//* FUNCTION iLockSem (int sem_id) *//* DESCRIPTION Locks a semaphore *//* *//* INPUT PARAMETERS sem_id: semaphore identifier *//* *//* OUTPUT PARAMETERS 0: OK, -1 error *//* *//*__________________________________________________________________________*/int iLockSem(int sem_id){int iRetValue; // return valuestruct sembuf sops; // semaphore operatios structureint res; sops.sem_num = 0; sops.sem_op = -1; // locks semaphore and wait if locked sops.sem_flg = SEM_UNDO; //undo if process terminates or dies if ((res = semop(sem_id, &sops, 1)) == -1) { fprintf(stderr,"iLockSem : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno)); iRetValue = -1; } else { iRetValue = 0; } if (iDebug & DEP_SEM) { fprintf(stderr,"iLockSem : sem_id = %d res = %d\n",sem_id,res); } return(iRetValue);}/*__________________________________________________________________________*//* FUNCTION iDelSem (int sem_id) *//* DESCRIPTION Destroys a semaphore *//* *//* INPUT PARAMETERS sem_id: semaphore identifier *//* *//* OUTPUT PARAMETERS 0: OK, -1 error *//* *//*__________________________________________________________________________*/int iDelSem(int sem_id){int iRetValue; if (semctl(sem_id,0,IPC_RMID) == -1) { fprintf(stderr,"iDelSem : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno)); iRetValue = -1; } else { iRetValue = 0; } return(iRetValue);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -