为了创建一个新的信号量集,或者访问一个已存在的集合,semget()系统调用被使用。
SYSTEM CALL: semget(); PROTOTYPE: int semget ( key_t key, int nsems, int semflg ); RETURNS: semaphore set IPC identifier on success -1 on error: errno = EACCESS (permission denied) EEXIST (set exists, cannot create (IPC_EXCL)) EIDRM (set is marked for deletion) ENOENT (set does not exist, no IPC_CREAT was used) ENOMEM (Not enough memory to create new set) ENOSPC (Maximum set limit exceeded) NOTES:
如果信号量集在内核中不存在,则创建它。
当与 IPC_CREAT 一起使用时,如果信号量集已存在则失败。
如果IPC_CREAT单独使用,semget()要么为新创建的集合返回信号量集标识符,要么为具有相同键值的现有集合返回标识符。如果IPC_EXCL与IPC_CREAT一起使用,那么要么创建一个新集合,要么如果集合存在,调用将失败并返回 -1。IPC_EXCL本身是无用的,但是当与IPC_CREAT结合使用时,它可以作为一种机制来保证没有现有的信号量集被打开以进行访问。
与其他形式的 System V IPC 一样,一个可选的八进制模式可以与掩码进行“或”运算,以形成信号量集的权限。
参数nsems指定应在新集合中创建的信号量的数量。这代表了我们之前描述的虚构打印室中的打印机数量。集合中信号量的最大数量在 ``linux/sem.h'' 中定义为
#define SEMMSL 32 /* <=512 max num of semaphores per id */
请注意,如果您显式打开一个现有的集合,nsems参数将被忽略。
让我们创建一个包装函数来打开或创建信号量集
int open_semaphore_set( key_t keyval, int numsems ) { int sid; if ( ! numsems ) return(-1); if((sid = semget( mykey, numsems, IPC_CREAT | 0660 )) == -1) { return(-1); } return(sid); }