程序間的通訊方式

2021-07-04 15:49:11 字數 2778 閱讀 4438

侷限性

(1)半雙工。

(2)只能在具有公共祖先的兩個程序間通訊。

建立

#include 

int pip(int fd[2]);

引數fd返回兩個檔案描述符:fd[0]為讀而開啟,fd[1]為寫而開啟。fd[1]寫入,fd[0]讀出。

3. 經由父程序向子程序傳送資料的例子

#include "apue.h"

int main()

else//child

exit(0);

}

函式popen和pclose

#include 

file *popen(const

char *cmdstring,const

char *type);

int pclose(file *fp);

建立乙個管道,fork乙個子程序,關閉未使用的管道,執行乙個shell命令,然後等待命令終止。

不相關的程序間交換資料(命名的管道)

建立

#include 

int mkfifo(const

char *path,mode_t mode);

int mkfifoat(int fd,const

char *path,mode_t mode);

path為絕對路徑,fd引數被忽略,mkfifo與mkfifoat相似;path相對路徑,fd是乙個開啟目錄的有效檔案描述符;path相對路徑,且fp有特殊值at_fdcwd,則路徑名以當前目錄開始,mkfifo與mkfifoat相似。

3. 用途

shell命令使用fifo將資料從一條管道傳送到另一條時,無需建立中間臨時檔案;客戶程序-伺服器程序應用程式中,fifo用作匯聚點,在客戶程序和伺服器程序二者之間傳遞資料。

訊息的鏈結表,儲存在核心中,由訊息佇列識別符號標識。

建立

#include 

int msgget(key_t key,int flag);//開啟乙個現有佇列或是建立乙個新佇列

int msgsnd(int msqid,const

void*ptr,size_t nbytes,int flag);//將資料放入到訊息佇列中,訊息總是放在佇列尾端

ssize_t msgrcv(int msqid,void *ptr,size_t nbytes,long type,int flag);//從訊息佇列中取用訊息

ptr引數指向乙個長整型數(其中儲存的是返回的訊息型別),其後面是儲存實際訊息資料的緩衝區。nbytes指定了資料緩衝區的長度。type=0,返回佇列中的第乙個訊息;type>0,返回佇列中訊息型別為type的第乙個訊息;type<0,=,返回佇列中訊息型別值小於等於type絕對值的訊息,如果這種訊息有多個,則取型別值最小的。

訊號量與前面的ipc機構(管道、fifo以及訊息佇列)不同,它是乙個計數器,用於為多個程序提供對共享資料物件的訪問。

1. 為獲得資源程序的操作:測試控制所需資源的訊號量;若該資源的訊號量的值為正,則可以使用該資源,獲得資源使用權後,訊號量的值會減1; 若訊號量的值為0,則程序進入休眠狀態,等到訊號量的值大於0時才被喚醒。

2. 核心為訊號量維護的semid_ds結構

struct semid_ds;
每乙個訊號量有乙個無名結構表示

struct;
建立

#include 

int semget(key_t key,int nsems,int flag);

若成功返回乙個訊號量的id,key為訊號量物件的外部名,其中nsems表示集合中的訊號量數。

允許兩個或是多個程序共享乙個給定的儲存區。資料不需要在客戶和伺服器程序間複製,所以這是最快的一種ipc。使用共享儲存需要知道,在多個程序之間同步的訪問乙個給定的儲存區。

1. 共享儲存的結構

struct;
建立

#include

int shmget(key_t key,size_t size,int flag);

獲得乙個儲存識別符號,在建立新的ipc結構時,如果key是ipc_private或者和當前某種型別的ipc結構無關,則需要指明flag的ipc_creat標誌位。為了引用乙個現有的佇列,key必須等於佇列建立時指明的key的值,且ipc_creat必須不被指明。msgget和semget也是這樣的。

3. 位置:共享儲存段緊靠在棧之下

訊號量:先建立乙個包含該訊號量的集合,然後再將該訊號量初始化為1。分配資源,以sem_op為-1呼叫semop;釋放資源,以sem_op為1呼叫semop。對每個操作都指定sem_undo,以處理在為釋放資源條件下程序終止的情況。

記錄鎖:先建立乙個空檔案,且用該檔案的第乙個位元組作為鎖。分配資源,先對該位元組獲得乙個寫鎖;釋放資源,則對該位元組解鎖。記錄鎖的性質確保了當乙個鎖的持有者程序終止時,核心會自動釋放該鎖。

互斥訊號量:需要所有的程序將相同的檔案對映到他們的位址空間裡,且使用pthread_process_shared互斥量屬性在檔案的相同偏移處初始化互斥量。分配資源,對互斥量加鎖;釋放資源,解鎖互斥量。如果乙個程序沒有釋放互斥量而終止,恢復很困難,除非是用魯棒性的互斥量。

程序間的通訊方式,執行緒間的通訊方式 程序

當時做筆記的時候 忘了在 看到的了,有時間我再研究研究 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semo...

程序間通訊的方式?執行緒間通訊的方式?

管道 命名管道 訊號量 訊息佇列 訊號及共享記憶體只適用於本地程序間通訊,套接字則可用於遠端通訊,因而一般用於網路程式設計。部分概念解釋 匿名管道是在快取中開闢的輸出和輸入檔案流的空間,只能用於父子關係的程序之間。因為父子程序的輸入和輸出檔案描述符是一致的。命名管道是一種實際存在的fifo檔案,稱作...

程序間通訊方式

謝謝作者 用於程序間通訊 ipc 的四種不同技術 共享記憶體,臨界區,管道,訊息 1.訊息傳遞 管道,fifo,posix和system v訊息佇列 2.同步 互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,posix和system v訊號燈 3.共享記憶體區 匿名共享記憶體區,有名posix共享記憶體區,...