Linux 程序間通訊詳解二

2021-09-07 08:13:23 字數 1675 閱讀 5889

訊息佇列

--訊息佇列提供了本機上從乙個程序向另外乙個程序傳送一塊資料的方法

--每個資料塊都被認為有乙個型別,接收者程序接收的資料塊可以有不同的型別值

--訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是由上限的(msgmax),每個訊息佇列的總的位元組數是有上限的(msgmnb),系統上訊息佇列的總數也有乙個上限(msgmni)

訊息大小的三大限制

cat /proc/sys/kernel/msgmax --最大訊息的長度限制(65536

)cat /proc/sys/kernel/msgmnb --訊息佇列總的位元組數(65536

)cat /proc/sys/kernel/msgmni --訊息佇列的條目數(1465)

刪除訊息佇列命令

--ipcrm msg msqid (注意是msg不是msq)

--ipcrm -q msqid

--注意:當msqid大於0時,這兩個命令都可以釋放訊息佇列,但是當msqid=0時(msqid=0這種情況很罕見),ipcrm msg msqid會報錯

megget()函式

int msgget(key_t key, int

msg***);

--功能:用來建立和訪問乙個訊息佇列

--引數

key 某個訊息佇列的名字

msg*** 由九個許可權標誌構成,他們的用法和建立檔案時使用的model模式標誌是一樣的

詳解:這實際上是乙個字變數,int型別有32位,前面9位用來標識讀寫許可權(rwxr--r--)

--成功返回乙個非負整數,失敗返回-1,並且更新errno

訊息佇列

#include #include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args)

if (errno ==eexist)

perror(

"msgget() err");

return -1

; }

printf(

"建立訊息佇列成功!id=%d \n

", msgid);

return0;

}

//

訊息佇列

#include #include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args)

//以可讀可寫的許可權訪問乙個唯讀不可寫的訊息佇列 報錯

msgid = msgget(0x1234, 0666

);

if (msgid == -1

)

return0;

}

Linux 程序間通訊詳解

pipe管道 用於有血緣關係的程序間通訊。ps aux grep ls wc l 父子程序間通訊 兄弟程序間通訊 fifo管道 可以用於無血緣關係的程序間通訊。命名管道 mkfifo 無血緣關係程序間通訊 讀端,open fifo o rdonly 寫端,open fifo o wronly檔案實現...

Linux程序間通訊(二)

一 概念 匿名管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因此,即使程序與建立fifo的程...

程序間通訊(二)

傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...