調用原型: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
返回值: 0 ,如果成功。
- 1,如果失敗:errno = EACCES (沒有讀的許可權同時cmd 是IPC_STAT )
EFAULT (buf 指向的地址無效)
EIDRM (在讀取中佇列被刪除)
EINVAL (msgqid無效, 或者msgsz 小於0 )
EPERM (IPC_SET或者IPC_RMID 命令被使用,但調用程式沒有寫的許可權)
下面我們看一下可以使用的幾個命令:
IPC_STAT
讀取訊息佇列的數據結構msqid_ds,並將其存儲在b u f指定的地址中。
IPC_SET
設定訊息佇列的數據結構msqid_ds中的ipc_perm元素的值。這個值取自buf參數。
IPC_RMID
從系統核心中移走訊息佇列。
我們在前面討論過了訊息佇列的數據結構(msqid_ds)。系統核心中為系統中的每一個訊息佇列保存一個此數據結構的實例。通過使用IPC_STAT命令,我們可以得到一個此數據結構的副本。下面的程式就是實現此函式的過程: int get_queue_ds( int qid, struct msgqid_ds *qbuf )
{
if( msgctl( qid, IPC_STAT, qbuf) == -1)
{
return(-1);
}
return(0);
} 如果不能複製內部緩衝區,調用進程將返回-1。如果調用成功,則返回0。緩衝區中應該包括訊息佇列中的數據結構。
訊息佇列中的數據結構中唯一可以改動的元素就是ipc_perm。它包括佇列的存取權限和關於佇列創建者和擁有者的信息。你可以改變用戶的id、用戶的組id以及訊息佇列的存取許可權。
下面是一個修改佇列存取模式的程式: int change_queue_mode(int qid, char *mode )
{
struct msqid_ds tmpbuf;
/* Retrieve a current copy of the internal data structure */
get_queue_ds( qid, &tmpbuf);
/* Change the permissions using an old trick */
sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);
/* Update the internal data structure */
if( msgctl( qid, IPC_SET, &tmpbuf) == -1)
{
return(-1);
}
return(
} 我們通過調用get_queue_ds來讀取佇列的內部數據結構。然後,我們調用sscanf( )修改數據結構msg_perm中的mode 成員的值。但直到調用msgctl()時,許可權的改變才真正完成。在這裡msgctl()使用的是IPC_SET命令。
最後,我們使用系統調用msgctl ( )中的IPC_RMID命令刪除訊息佇列: int remove_queue(int qid )
{
if( msgctl( qid, IPC_RMID, 0) == -1)
{
return(-1);
}
return(0);
}
};
相關詞條
-
msgctl
msgctl()定義在sys/msg.h中,其函式原型為:int msgctl(int msqid,int cmd,struct msqid_ds *b...
-
semctl
msgctl中,最後一個參數是指向核心中使用的數據結構的指針。我們使用此...
定義 參數說明 -
精通ARM嵌入式Linux系統開發
基本信息作者: 楊水清 出版社:電子工業出版社 ISBN:9787121161971 上架時間:2012-5-...
基本信息 內容簡介 目錄 -
ARM嵌入式Linux系統開發技術詳解
宣傳語繼《Windows驅動開發技術詳解》之後又一本心血力作!原創經典,嵌入式系統一線工程師傾力打造。深入Linux系統底層和內...
宣傳語 內容簡介 前言 本書特點 目錄 -
Linux系統分析與高級編程技術
內容介紹本書介紹Linux環境下的編程方作品目錄目 錄前言第一篇 Linux系統介紹第1章 Linux簡介1.1Linux的起源...
內容介紹 作品目錄 -
訊息傳遞
訊息內容if((msgctl(qid,IPC_RMID,NULL)) 0){ printf("msgctl fail\n"); exit...
原語 UNIX System V訊息佇列 -
Linux高性能伺服器編程
調用13.7.4 msgctl系統調用13.8 IPC命令13.9...
基本介紹 內容簡介 作者簡介 目錄 -
ipcrm
SemaphoreKey 創建的信號標識和與其相關的信號量集和數據結構。msgctl...
-
Linux環境編程
8.7.4 msgrcv函式 2458.7.5 msgctl函式...
內容簡介 目錄