int msgget(key_t key, int msgflag)功能: 用於創建一個新的或打開一個已經存在的訊息佇列,此訊息佇列與key相對應。參數: key:函式ftok的返回值或IPC_PRIVATE。 msgflag: IPC_CREAT:創建新的訊息佇列。 IPC_EXCL:與IPC_CREAT一同使用,表示如果要創建的訊息佇列已經存在,則返回錯誤。 IPC_NOWAIT:讀寫訊息佇列要求無法滿足時,不阻塞。返回值: 調用成功返回佇列標識符,否則返回-1.
在以下兩種情況下,將創建一個新的訊息佇列:
1、如果鍵的值是IPC_PRIVATE。
2、或者鍵的值不是IPC_PRIVATE,並且鍵所對應的訊息佇列不存在,同時標誌中指定IPC_CREAT。
基本介紹
- 中文名:msgget
- 獲取:與某個鍵關聯的訊息佇列標識
- 參數:訊息佇列對象的關鍵字
- 對象:是新創建的用戶
功能描述:,細節敘述,使用說明,範例,相關函式,
功能描述:
獲取與某個鍵關聯的訊息佇列標識。訊息佇列被建立的情況有兩種:
如果新的訊息佇列被建立,它關聯的msqid_ds數據結構初始化如下:
msg_perm.cuid 和 msg_perm.uid設為調用者的有效用戶標誌;
msg_perm.cgid 和 msg_perm.gid設為調用者的有效用戶組標誌;
msg_perm.mode最低9個位設為msgflg的最低9個位;
msg_qnum,msg_lspid,msg_lrpid,msg_stime和msg_rtime設為0;
msg_ctime設為當前時間;
msg_qbytes設為系統限制MSGMNB。
細節敘述
msgget()函式的第一個參數是訊息佇列對象的關鍵字(key),函式將它與已有的訊息隊
列對象的關鍵字進行比較來判斷訊息佇列對象是否已經創建。而函式進行的具體操作是由
第二個參數,msgflg 控制的。它可以取下面的幾個值:
IPC_CREAT :
如果訊息佇列對象不存在,則創建之,否則則進行打開操作;
IPC_EXCL:
和IPC_CREAT 一起使用(用”|”連線),如果訊息對象不存在則創建之,否則產生一個
錯誤並返回。
如果單獨使用IPC_CREAT 標誌,msgget()函式要么返回一個已經存在的訊息佇列對象
的標識符,要么返回一個新建立的訊息佇列對象的標識符。如果將IPC_CREAT 和IPC_EXCL
標誌一起使用,msgget()將返回一個新建的訊息對象的標識符,或者返回-1 如果訊息佇列
對象已存在。IPC_EXCL 標誌本身並沒有太大的意義,但和IPC_CREAT 標誌一起使用可
以用來保證所得的訊息佇列對象是新創建的而不是打開的已有的對象。
除了以上的兩個標誌以外,在msgflg 標誌中還可以有存取許可權控制符。這種控制符的
意義和檔案系統中的許可權控制符是類似的。
列對象的關鍵字進行比較來判斷訊息佇列對象是否已經創建。而函式進行的具體操作是由
第二個參數,msgflg 控制的。它可以取下面的幾個值:
IPC_CREAT :
如果訊息佇列對象不存在,則創建之,否則則進行打開操作;
IPC_EXCL:
和IPC_CREAT 一起使用(用”|”連線),如果訊息對象不存在則創建之,否則產生一個
錯誤並返回。
如果單獨使用IPC_CREAT 標誌,msgget()函式要么返回一個已經存在的訊息佇列對象
的標識符,要么返回一個新建立的訊息佇列對象的標識符。如果將IPC_CREAT 和IPC_EXCL
標誌一起使用,msgget()將返回一個新建的訊息對象的標識符,或者返回-1 如果訊息佇列
對象已存在。IPC_EXCL 標誌本身並沒有太大的意義,但和IPC_CREAT 標誌一起使用可
以用來保證所得的訊息佇列對象是新創建的而不是打開的已有的對象。
除了以上的兩個標誌以外,在msgflg 標誌中還可以有存取許可權控制符。這種控制符的
意義和檔案系統中的許可權控制符是類似的。
使用說明
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
例:msgget(key,IPC_CREAT|0666)
參數:
key:訊息佇列關聯的鍵。
msgflg:訊息佇列的建立標誌和存取許可權。
IPC_CREAT如果核心中沒有此佇列,則創建它。
IPC_EXCL當和IPC_CREAT一起使用時,如果佇列已經存在,則失敗。
如果單獨使用IPC_CREAT,則msgget()要么返回一個新創建的訊息佇列的標識符,要么返回具有相同關鍵字值的佇列的標識符。如果IPC_EXCL和IPC_CREAT一起使用,則msgget()要么創建一個新的訊息佇列,要么如果佇列已經存在則返回一個失敗值-1。IPC_EXCL單獨使用是沒有用處的。
返回說明:
成功執行時,返回訊息佇列標識值。失敗返回-1,errno被設為以下的某個值 ,有時也會返回0,這個時候也是可以正常使用的
EACCES:指定的訊息佇列已存在,但調用進程沒有許可權訪問它,而且不擁有CAP_IPC_OWNER權能
EEXIST:key指定的訊息佇列已存在,而msgflg中同時指定IPC_CREAT和IPC_EXCL標誌
ENOENT:key指定的訊息佇列不存在同時msgflg中不指定IPC_CREAT標誌
ENOMEM:需要建立訊息佇列,但記憶體不足
ENOSPC:需要建立訊息佇列,但已達到系統的最大訊息佇列容量
範例
int open_queue( key_t keyval )
{
int qid;
if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
{
return(-1);
}
return(qid);
}
{
int qid;
if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
{
return(-1);
}
return(qid);
}
需要注意的一點就是在msgflg 中加入了存取許可權控制符0660
相關函式
msgsnd 用於傳送訊息
msgrcv 用於接收訊息
參見詞條:msgsnd/msgrcv