Posted on 2008-08-18 20:22
Prayer 閱讀(622)
評論(0) 編輯 收藏 引用 所屬分類:
LINUX/UNIX/AIX
系統(tǒng)調用msgget()
如果希望創(chuàng)建一個新的消息隊列,或者希望存取一個已經(jīng)存在的消息隊列,你可以使用系統(tǒng)調用msgget()。
系統(tǒng)調用:msgget();
原型:intmsgget(key_t key,int msgflg);
返回值:如果成功,返回消息隊列標識符
如果失敗,則返回-1:errno=EACCESS(權限不允許)
EEXIST(隊列已經(jīng)存在,無法創(chuàng)建)
EIDRM(隊列標志為刪除)
ENOENT(隊列不存在)
ENOMEM(創(chuàng)建隊列時內存不夠)
ENOSPC(超出最大隊列限制)
系統(tǒng)調用msgget()中的第一個參數(shù)是關鍵字值(通常是由ftok()返回的)。然后此關鍵字值將會和其他已經(jīng)存在于系統(tǒng)內核中的關鍵字值比較。這時,打開和存取操作是和參數(shù)msgflg中的內容相關的。
IPC_CREAT如果內核中沒有此隊列,則創(chuàng)建它。
IPC_EXCL當和IPC_CREAT一起使用時,如果隊列已經(jīng)存在,則失敗。
如果單獨使用IPC_CREAT,則msgget()要么返回一個新創(chuàng)建的消息隊列的標識符,要么返回具有相同關鍵字值的隊列的標識符。如果IPC_EXCL和IPC_CREAT一起使用,則msgget()要么創(chuàng)建一個新的消息隊列,要么如果隊列已經(jīng)存在則返回一個失敗值-1。IPC_EXCL單獨使用是沒有用處的。
下面看一個打開和創(chuàng)建一個消息隊列的例子:
intopen_queue(key_t keyval)
{
intqid;
if((qid=msgget(keyval,IPC_CREAT|0660))==-1)
{
return(-1);
}
return(qid);
}