cutil-slock.c

来自「Linux环境下常用功能的实现」· C语言 代码 · 共 143 行

C
143
字号
#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 + =
减小字号Ctrl + -
显示快捷键?