msgget() - Unix、Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於TP  

msgget() - Unix、Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

msgget - 獲取訊息佇列識別符號

語法

 
#include <sys/types.h>
 
#include <sys/ipc.h>
 
#include <sys/msg.h>

int msgget(key_t key, int msgflg);

描述

msgget() 系統呼叫返回與key引數值關聯的訊息佇列識別符號。如果key的值為IPC_PRIVATE,或者key不是IPC_PRIVATE且不存在具有給定鍵key的訊息佇列,並且在msgflg中指定了IPC_CREAT,則會建立一個新的訊息佇列。

如果msgflg同時指定了IPC_CREATIPC_EXCL,並且對於key已經存在訊息佇列,則msgget()將失敗,並將errno設定為EEXIST。(這類似於open(2)的組合O_CREAT | O_EXCL的效果。)

建立時,引數msgflg的最低有效位定義了訊息佇列的許可權。這些許可權位具有與為open(2)的mode引數指定的許可權相同的格式和語義。(執行許可權未使用。)

如果建立了一個新的訊息佇列,則其關聯的資料結構msqid_ds(參見msgctl(2))將按如下方式初始化

標籤描述
msg_perm.cuidmsg_perm.uid設定為呼叫程序的有效使用者ID。
msg_perm.cgidmsg_perm.gid設定為呼叫程序的有效組ID。
msg_perm.mode的最低有效9位設定為msgflg的最低有效9位。
msg_qnummsg_lspidmsg_lrpidmsg_stimemsg_rtime設定為0。
msg_ctime設定為當前時間。
msg_qbytes設定為系統限制MSGMNB
如果訊息佇列已存在,則會驗證許可權,並檢查它是否被標記為要銷燬。

返回值

如果成功,則返回值將是訊息佇列識別符號(一個非負整數),否則為-1,其中errno指示錯誤。

錯誤

如果失敗,errno將設定為以下值之一
標籤描述
EACCES 對於key存在訊息佇列,但呼叫程序沒有許可權訪問該佇列,並且沒有CAP_IPC_OWNER功能。
EEXIST 對於key存在訊息佇列,並且msgflg同時指定了IPC_CREATIPC_EXCL
ENOENT 對於key不存在訊息佇列,並且msgflg沒有指定IPC_CREAT
ENOMEM 必須建立一個訊息佇列,但系統沒有足夠記憶體用於新的資料結構。
ENOSPC 必須建立一個訊息佇列,但將超過訊息佇列最大數量的系統限制(MSGMNI)。

備註

IPC_PRIVATE不是標誌欄位,而是key_t型別。如果將此特殊值用於key,則系統呼叫將忽略msgflg的最低有效9位以外的所有內容,並在成功時建立一個新的訊息佇列。

以下是影響msgget()呼叫的訊息佇列資源的系統限制

標籤描述
MSGMNI 系統範圍內的最大訊息佇列數量:策略相關(在 Linux 上,可以透過/proc/sys/kernel/msgmni讀取和修改此限制)。

缺陷

名稱選擇 IPC_PRIVATE 可能是不幸的,IPC_NEW 將更清楚地顯示其功能。

符合標準

SVr4、POSIX.1-2001。

Linux 備註

在 2.3.20 之前的 Linux 版本中,將為計劃刪除的訊息佇列上的msgget()返回 EIDRM。

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.