Linux 下程序間的通訊(上)

2021-10-01 12:10:14 字數 2064 閱讀 3379

1.傳統的nuix通訊方式:

無名管道,有名管道以及訊號;

2.ipc程序間的通訊方式:

訊息佇列,共享記憶體及訊號燈集;

注:全部的通訊方式都是在核心中完成;

> 以下是各種通訊方式的詳細介紹

list item管道通訊:

管道不屬於任何檔案系統,且只存在與記憶體中,但對於管道的讀寫也可以使用普通的read();write()等函式來操作(lseek除外);

**無名管道:**只能適用於具有親緣關係的程序間的通訊;

是單工的通訊模式,具有固定的讀寫端;

建立函式:int pipe(int fd[ ]);成功返回:0;失敗返回:-1;

注:fd:包含兩個元素的整型陣列(fd[0]:讀端,fd[1]:寫端);

**有名管道:**解決了無名管道只能親緣程序間通訊的侷限性(該管道通過路徑名來指出);

嚴格遵循先進先出的規則;

建立函式:mkfifo (const char*filename/管道名/,mode_t mode/許可權/);

成功返回:0;失敗返回:-1;

**訊息佇列:**就是一些訊息的列表,使用者可以在訊息佇列中讀取和寫入一些訊息;

訊息佇列的實現包括建立和開啟訊息佇列,新增訊息佇列,讀取訊息對列和控制訊息佇列這4種操作。

建立乙個key值:

key_t ftok(const char *pathname, int proj_id);

功能:通過檔案和乙個整型陣列合成乙個key值

返回值:成功返回組合好的key,失敗返回-1

pathname:某乙個檔案及其路徑

proj_id:某個要組合在一起的整型數

將檔案的i節點和proj_id的值進行組合

ftok(".", 『a』);

建立或開啟訊息佇列:

int msgget(key_t key, int msg***);

功能:建立乙個或者開啟乙個訊息佇列

返回值:成功返回訊息佇列的id號,失敗返回-1

key:表示用唯一的標誌去申請訊息佇列(ftok的返回值或者0)

msg***:開啟訊息佇列的標誌 ipc_creat|0666

在訊息佇列中新增訊息:

int msgsnd(int msqid, const void msgp, size_t msgsz, int msg***);

功能:將乙個訊息以某種型別新增到訊息佇列中

返回值:成功返回0,失敗返回-1

msqid:訊息佇列的id號

msgp:乙個結構體的指標

struct msgbuf msg;

這個結構就表示乙個訊息的整體。第乙個成員mtype表示訊息的型別,其他成員都是訊息的正文

msgsz:要傳送的訊息的大小

msg***:傳送訊息的方式

0 表示阻塞等待傳送完成

ipc_nowait:不阻塞的傳送,因為各種原因傳送不了就直接返回-1

從訊息佇列中取出訊息:

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);

功能:從乙個訊息佇列中拿出某種型別的訊息

返回值:成功返回訊息位元組數,失敗返回-1

msqid:訊息佇列的id號

msgp:乙個結構體的指標,用於接收訊息

msgsz:要接收的訊息的大小

msgtyp:要接收的訊息的型別

msg***:接收訊息的方式

ipc_nowait:一般這個引數會和接收函式一起使用

sizeof(msg) - sizeof(msg.mtype)

訊息佇列的操作函式:

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

cmd:可以獲得或者設定屬性、刪除物件

ipc_rmid 不是馬上就刪掉,而是設定乙個刪除標記。當所有程序都不再使用的時候才進行刪除

這裡是引用

個人學習總結,大神勿噴

python 程序間通訊 上

一 使用queue來實現程序間的記憶體共享 coding utf 8 from multiprocessing import process,queue import os,time def f q,n q.put n,hello if name main 此queue不是直接匯入的import q...

實驗四 程序間通訊(上)

一 實驗名稱 實驗四 程序間通訊 上 二 實驗日期 2014 3 20 三 實驗目的 1.通過實驗理解軟中斷訊號機制以及如何通過軟中斷實現父子程序同步 2.通過實驗理解無名管道通訊 四 實驗的步驟和方法 第四次小課程序間通訊 上 第一部分本週大課內容回顧 主要內容 1.軟中斷 2.管道通訊 l 程序...

程序間通訊(上)基礎函式篇

printf d d n fds 0 fds 1 3和4,相當於用兩種方式開啟了1個檔案 pid t id fork 建立子程序 if id 0 close fds 1 關閉pipe檔案 exit 0 else if id 0 else waitpid id,null,0 等待子程序退出 int m...