📄 cutil-slock.c
字号:
#include "cutil.h"/** * cutil_slock_init * @nKey: 信号锁的键值 * * 创建并初始化信号锁 * * Returns: 成功返回信号锁键值.失败返回-1 */int cutil_slock_init(int nKey){ int nSemId; union semun { int val; }arg; if((nSemId = semget(nKey, 3, IPC_CREAT | IPC_EXCL| 0600)) < 0) { if(errno == EEXIST) { if((nSemId = semget(nKey, 3, 0600)) < 0) { cutil_log_error(N_("create semphore:%d error:%s\n"), nKey, strerror(errno)); return -1; } return nSemId; } } arg.val = 0; if(semctl(nSemId, 0, SETVAL, arg) < 0) { cutil_log_error(N_("set semphore value error:%s\n"), strerror(errno)); return -1; } arg.val = 0; if(semctl(nSemId, 1, SETVAL, arg) < 0) { cutil_log_error(N_("set semphore value error:%s\n"), strerror(errno)); return -1; } arg.val = 1; if(semctl(nSemId, 2, SETVAL, arg) < 0) { cutil_log_error(N_("set semphore value error:%s\n"), strerror(errno)); return -1; } return nSemId;}/** * cutil_slock_set_read * @nSemID: 信号锁的键值 * * 设置只读锁 * * Returns: 成功返回0.失败返回-1 */int cutil_slock_set_read(int nSemID){ static struct sembuf struSemBuf[2] = { {0, 1, 0}, {1, 0, 0}, }; if(semop(nSemID, struSemBuf, 2) < 0) { cutil_log_error(N_("set read lock error:%s\n"), strerror(errno)); return -1; } return 0;}/** * cutil_slock_unset_read * @nSemID: 信号锁的键值 * * 取消只读锁 * * Returns: 成功返回0.失败返回-1 */int cutil_slock_unset_read(int nSemId){ static struct sembuf struSemBuf[1] = { {0, -1, IPC_NOWAIT}, }; if(semop(nSemId, struSemBuf, 1) < 0) { cutil_log_error(N_("unset read lock error:%s\n"), strerror(errno)); return -1; } return 0;}/** * cutil_slock_set_write * @nSemID: 信号锁的键值 * * 设置只写锁 * * Returns: 成功返回0.失败返回-1 */int cutil_slock_set_write(int nSemID){ static struct sembuf struSemBuf[3] = { {0, 0, 0}, {1, 1, 0}, {2, -1, 0}, }; if(semop(nSemID, struSemBuf, 3) < 0) { cutil_log_error(N_("set write lock error:%s\n"), strerror(errno)); return -1; } return 0;}/** * cutil_slock_unset_write * @nSemID: 信号锁的键值 * * 取消只写锁 * * Returns: 成功返回0.失败返回-1 */int cutil_slock_unset_write(int nSemId){ static struct sembuf struSemBuf[2] = { {1, -1, IPC_NOWAIT}, {2, 1, IPC_NOWAIT} }; if(semop(nSemId, struSemBuf, 2) < 0) { cutil_log_error(N_("unset write lock error:%s\n"), strerror(errno)); return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -