msgsnd/msgrcv

msgsnd/msgrcv

msgrcv/msgsnd為linux系統中異步或進程間通信的一種機制,這兩個函式主要用於操作特定的訊息佇列。msgrcv()可以從訊息佇列中讀取訊息,msgsnd()將一個新的訊息寫入佇列。

基本介紹

  • 參數1:msqid
  • 參數2:msgp
  • 參數3:msgsz
  • 參數4:msgflg
系統調用,功能描述,用法,函式原型,參數,返回說明,

系統調用

功能描述

msgrcv()可以從訊息佇列中讀取訊息,msgsnd()將一個新的訊息寫入佇列。
訊息佇列上進行收發訊息。為了傳送訊息,調用進程對訊息佇列進行寫入時必須有寫權能。接收訊息時必須有讀權能。

用法

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

函式原型

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

參數

msqid:訊息佇列的識別碼。
msgp:指向訊息緩衝區的指針,此位置用來暫時存儲傳送和接收的訊息,是一個用戶可定義的通用結構,形態如下
struct msgbuf {
long mtype; /* 訊息類型,必須 > 0 */
char mtext[1]; /* 訊息文本 */
};
msgsz:訊息的大小。
msgtyp:訊息類型
msgtyp等於0 則返回佇列的最早的一個訊息。
msgtyp大於0,則返回其類型為msgtyp的第一個訊息。
msgtyp小於0,則返回其類型小於或等於mtype參數的絕對值的最小的一個訊息。
msgflg:這個參數依然是是控制函式行為的標誌,取值可以是:0,表示忽略;IPC_NOWAIT,如果訊息佇列為空,則返回一個ENOMSG,並將控制權交回調用函式的進程。如果不指定這個參數,那么進程將被阻塞直到函式可以從佇列中得到符合條件的訊息為止。如果一個client 正在等待訊息的時候佇列被刪除,EIDRM 就會被返回。如果進程在阻塞等待過程中收到了系統的中斷信號,EINTR 就會被返回。MSG_NOERROR,如果函式取得的訊息長度大於msgsz,將只返回msgsz 長度的信息,剩下的部分被丟棄了。如果不指定這個參數,E2BIG 將被返回,而訊息則留在佇列中不被取出。當訊息從佇列內取出後,相應的訊息就從佇列中刪除了。

返回說明

成功執行時,msgsnd()返回0,msgrcv()返回拷貝到mtext數組的實際位元組數。失敗兩者都返回-1,errno被設為以下的某個值
[對於msgsnd]
EACCES:調用進程在訊息佇列上沒有寫權能,同時沒有CAP_IPC_OWNER權能
EAGAIN:由於訊息佇列的msg_qbytes的限制和msgflg中指定IPC_NOWAIT標誌,訊息不能被傳送
EFAULT:msgp指針指向的記憶體空間不可訪問
EIDRM:訊息佇列已被刪除
EINTR:等待訊息佇列空間可用時被信號中斷
EINVAL:參數無效
ENOMEM:系統記憶體不足,無法將msgp指向的訊息拷貝進來
[對於msgrcv]
E2BIG:訊息文本長度大於msgsz,並且msgflg中沒有指定MSG_NOERROR
EACCES:調用進程沒有讀權能,同時沒具有CAP_IPC_OWNER權能
EAGAIN:訊息佇列為空,並且msgflg中沒有指定IPC_NOWAIT
EFAULT:msgp指向的空間不可訪問
EIDRM:當進程睡眠等待接收訊息時,訊息已被刪除
EINTR:當進程睡眠等待接收訊息時,被信號中斷
EINVAL:參數無效
ENOMSG:msgflg中指定了IPC_NOWAIT,同時所請求類型的訊息不存在

相關詞條

熱門詞條

聯絡我們