next up previous contents
下一个: 系统调用:semop() 上: 6.4.3 信号量 前一个: 内核 sem 结构

系统调用:semget()

为了创建一个新的信号量集,或者访问一个已存在的集合,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:

的第一个参数是semget()是键值 (在我们的例子中由调用ftok()) 返回)。然后,这个键值会与内核中已存在的其他信号量集的键值进行比较。在那时,打开或访问操作取决于semflg参数的内容。

IPC_CREAT

如果信号量集在内核中不存在,则创建它。

IPC_EXCL

当与 IPC_CREAT 一起使用时,如果信号量集已存在则失败。

如果IPC_CREAT单独使用,semget()要么为新创建的集合返回信号量集标识符,要么为具有相同键值的现有集合返回标识符。如果IPC_EXCLIPC_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);
}

请注意显式权限0660的使用。这个小函数要么返回一个信号量集标识符 (int),要么在错误时返回 -1。键值必须传递给它,以及在创建新集合时要分配空间的信号量数量。在本节末尾给出的示例中,请注意 IPC_EXCL 标志的使用,以确定信号量集是否存在。


next up previous contents
下一个: 系统调用:semop() 上: 6.4.3 信号量 前一个: 内核 sem 结构

转换于
1996年3月29日 星期五 14:43:04 EST