⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semaphore.c

📁 btree的实现源代码
💻 C
字号:
/*  ####   ######  #    #    ##    #####   #    #   ####   #####   ###### #       #       ##  ##   #  #   #    #  #    #  #    #  #    #  #  ####   #####   # ## #  #    #  #    #  ######  #    #  #    #  #####      #  #       #    #  ######  #####   #    #  #    #  #####   # #    #  #       #    #  #    #  #       #    #  #    #  #   #   #  ####   ######  #    #  #    #  #       #    #   ####   #    #  ######*/static char sccsid[]="%Z% Module semiphore ( %M% ) %I% %G% %U%";/**	--- Includes*/#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/errno.h>#include "debug.h"/**	--- Definitions *//**	--- Externals*//**	--- Definitions of Local Module Functions*//**	--- Module Globals*//*.****************************************************** Function Name: 	semid** Access from:** Synopsis:** Arguments:** Description:** Return:** History:** Created  Mon Apr 10 09:16:45 EDT 1995 by Larry A. Walker**   for ITN Project, PRC McLean Va**  Modified:*******************************************************/int semid( int key ){#ifdef	__FUNCTION__#undef	__FUNCTION__#endif#define	__FUNCTION__	"semid"/* Auto's */	int sid;	extern int errno;	unsigned short value;Trace("Enter->%s()\n", "semid" );		errno = 0;	if((sid=semget((key_t)key, 1, 0))==-1){		if(errno == ENOENT){			/* it needs to be created */			if((sid=semget((key_t)key, 1, 0666|IPC_CREAT))==-1){				Debug("failed semget()\n");				return -1;			}else{				value = 1;				if( semctl( sid, 1, SETALL, &value) == -1){					Debug("failed semctl()\n");					return -1;				}			}		}	}else{	}	return(sid);	} /*end  "semid" *//*.****************************************************** Function Name: 	semcall** Access from:** Synopsis:** Arguments:** Description:** Return:** History:** Created  Mon Apr 10 10:39:13 EDT 1995 by Larry A. Walker**   for ITN Project, PRC McLean Va**  Modified:*******************************************************/int semcall( int key, int op, int pause){#ifdef	__FUNCTION__#undef	__FUNCTION__#endif#define	__FUNCTION__	"semcall"/* Auto's */	int sid;	struct sembuf sb;	extern int errno;Trace("Enter->%s()\n", "semcall" );	if(( sid = semid(key)) == -1){		return -1;	}	sb.sem_num = 0;	sb.sem_op = op;	sb.sem_flg = SEM_UNDO;	if((op == -1) && (pause == 0))		sb.sem_flg |= IPC_NOWAIT;	errno = 0;	if(semop(sid, &sb, 1) == -1){		Debug("failed semop()\n");		if(sb.sem_flg == IPC_NOWAIT){			if(errno == EAGAIN){				return 0;			}		}		return -1;	}	/* If nowait and it would have been successful, return 0, else	   return 1.  That is, if you set pause to 0 and call P() 	   and your return is 0, that means nobody was in the 	   area the semaphore had locked.  Useful for a	   should I do it now, or should I do it later sort of thing */	return 0;} /*end  "semcall" *//*.****************************************************** Function Name: 	P** Access from:** Synopsis:** Arguments:	** Description:	acquire a semaphore, if pause is set then *		do not return until the semiphore is acquired** Return:** History:** Created  Mon Apr 10 10:53:32 EDT 1995 by Larry A. Walker**   for ITN Project, PRC McLean Va**  Modified:*******************************************************/int P( int key , int pause){#ifdef	__FUNCTION__#undef	__FUNCTION__#endif#define	__FUNCTION__	"P"/* Auto's */Trace("Enter->%s()\n", "P" );	return(semcall(key, -1, pause));} /*end  "P" *//*.****************************************************** Function Name: 	V** Access from:** Synopsis:** Arguments:** Description:	release a semaphore** Return:** History:** Created  Mon Apr 10 10:54:35 EDT 1995 by Larry A. Walker**   for ITN Project, PRC McLean Va**  Modified:*******************************************************/int V( int key){#ifdef	__FUNCTION__#undef	__FUNCTION__#endif#define	__FUNCTION__	"V"/* Auto's */Trace("Enter->%s()\n", "V" );	return(semcall(key, 1, 0));} /*end  "V" *//*.****************************************************** Function Name: 	rmsem** Access from:** Synopsis:** Arguments:** Description:	remove the semiphore indicated by key** Return:** History:** Created  Mon Apr 10 11:03:47 EDT 1995 by Larry A. Walker**   for ITN Project, PRC McLean Va**  Modified:*******************************************************/int rmsem(int key){#ifdef	__FUNCTION__#undef	__FUNCTION__#endif#define	__FUNCTION__	"rmsem"/* Auto's */Trace("Enter->%s()\n", "rmsem" );	return ( semctl( semid( key ), 0, IPC_RMID) );} /*end  "rmsem" */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -