next up previous contents
下一个: 系统调用:msgsnd() 上一级: 6.4.2 消息队列 前一个: 内核 ipc_perm 结构

系统调用:msgget()

为了创建一个新的消息队列,或者访问一个已存在的消息队列,需要使用msgget()系统调用。


  SYSTEM CALL: msgget();                                                          

  PROTOTYPE: int msgget ( key_t key, int msgflg );                                             
    RETURNS: message queue identifier on success                                                       
             -1 on error: errno = EACCESS (permission denied)
                                  EEXIST (Queue exists, cannot create)
                                  EIDRM (Queue is marked for deletion)
                                  ENOENT (Queue does not exist)
                                  ENOMEM (Not enough memory to create queue)
                                  ENOSPC (Maximum queue limit exceeded)
  NOTES:

的第一个参数是msgget()键值(在我们的例子中由调用ftok())返回)。这个键值随后会与内核中已存在的其他消息队列的键值进行比较。在那个时间点,打开或访问操作取决于msgflg参数的内容。

IPC_CREAT

如果队列在内核中尚不存在,则创建队列。

IPC_EXCL

当与 IPC_CREAT 一起使用时,如果队列已存在,则失败。

如果IPC_CREAT单独使用,msgget()要么返回新创建的消息队列的消息队列标识符,要么返回具有相同键值的已存在队列的标识符。如果IPC_EXCLIPC_CREAT一起使用,那么要么创建一个新队列,要么如果队列已存在,则调用失败并返回 -1。IPC_EXCL本身没有用处,但当与IPC_CREAT结合使用时,它可以作为一种机制来保证不会打开现有队列进行访问。

可选的八进制模式可以与掩码进行“或”运算,因为每个 IPC 对象都具有与 UNIX 文件系统上的文件权限功能相似的权限!

让我们创建一个用于打开或创建消息队列的快速包装函数


int open_queue( key_t keyval )
{
        int     qid;
        
        if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
        {
                return(-1);
        }
        
        return(qid);
}

注意显式权限的使用,即0660。这个小函数要么返回一个消息队列标识符(int),要么在出错时返回 -1。键值必须作为其唯一参数传递给它。



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