为了创建一个新的消息队列,或者访问一个已存在的消息队列,需要使用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:
如果队列在内核中尚不存在,则创建队列。
当与 IPC_CREAT 一起使用时,如果队列已存在,则失败。
如果IPC_CREAT单独使用,msgget()要么返回新创建的消息队列的消息队列标识符,要么返回具有相同键值的已存在队列的标识符。如果IPC_EXCL与IPC_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); }