linux應用之 程序通訊

2021-06-05 05:19:17 字數 2157 閱讀 8590

程序間通訊基礎

程序間通訊的英文縮寫: ipc 

為什麼需要程序間通訊?資料傳輸,資源共享,通知事件,程序控制等。

linux程序間通訊方式(6種):管道,訊號,訊息佇列,共享記憶體,訊號量,套接字。

各種程序間通訊方式詳解

1 :管道通訊

int pipe (int name[2])

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

2):用於父程序與子程序之間的通訊。執行了該函式後,相當於開啟了兩個檔案,乙個檔案描述符為name[0],另乙個為name[1];若要往該管道中寫入資料,應該關閉name[0];往name[1]中寫資料;要從管道讀取資料,關閉name[1];從name[0]中讀取即可

2 有名管道函式

int  mkfifo

(const char *p

ath, mode_t mode)

1):表頭檔案 sys/types.h; sys/stat.h。

2):mode模式。同檔案的建立模式。

3):若成功則返回0,否則返回-1。

3 :訊號通訊

簡介:訊號通訊是unix系統最為古老的通訊方式。能產生訊號的方法有硬體和

軟體兩種。硬體諸如:按鍵,除數為0,訪問無效儲存空間等。軟體產生的訊號主要是通過命令或函式。

軟體產生訊號的方法,最重要的是kill函式和kill命令。另外還有raise函式,alarm函式。

訊號的種類非常繁多,並且都是以巨集定義的形式呈現,都是一些整形常量。常見的訊號:sigkill(該訊號結束接收該訊號的程序),sigint(來自鍵盤的中斷訊號ctrl+c),sigstop(來自鍵盤ctrl+z或者除錯程式的停止執行訊號)。

kill函式:  int kill(pid_t pid , int signo)。

raise函式   int raise(int signo)。

alarm函式   int alarm(unsigned int seconds)。該函式在設定時間後,產生乙個sigalarm訊號,如果不捕捉該訊號,則預設動作是終止該程序。

pause函式。 int pause(void)。該函式使呼叫程序掛起,直至捕捉到乙個訊號。

訊號的處理。呼叫函式signal。原型不容易理解,直接給出乙個例子:

signal(sigint, my_func); 此處的myfunc函式時自己定義的乙個處理sigint訊號函式。

4:訊息佇列通訊

簡介:unix古老的兩種通訊方式訊號通訊和管道通訊都有其缺陷。訊號通訊傳輸

的資訊量有限,而管道通訊則只能傳送無格式的位元組流。訊息佇列則則克服了上面的缺陷。

標頭檔案:#include 

#include 

應用舉例:首先定義乙個資料結構,第乙個成員必須是整形,或者長整形。它的作用是把資訊做乙個標識。寫進去的資訊如果是用100表示,那麼讀的時候也必須帶上引數100,才能從訊息佇列中讀出這條資訊。

struct msg_buf

int mtype;

char data[255];

key_t ftok(char *pathname , char pro); pro只要不為0即可

msgid=msgget(key,ipc_creat|0666);

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),ipc_nowait);

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),mtype值,ipc_nowait)

5:訊號量

簡介:與其它的通訊方式不同,訊號量主要是用於保護臨界資源。程序可以根據它判定是否能夠訪問某些共享資源。

分類:二值訊號燈和計數訊號燈。

6:共享記憶體

產生共享記憶體:      shm_id=shmget(鍵值, 大小,讀寫許可權) ;    為了防止輸入的具體鍵值可能已經被占用,可以使用巨集ipc_private

。來重新新建一塊共享記憶體,它會自動使用新的鍵值。鍵值通常用

ipc_private. 

讀寫許可權用

s_irusr|s_iwusr

對映共享記憶體: 乙個具體的例子:

c_addr = shmat(shmid,0,0);

其中shmid

是由shmget

得到的,第二個

0,表示對映到應用程式的共享記憶體的起始位置。第三個引數不是很明白。

Linux應用 之 訊號

1.訊號可以理解為軟體中斷,是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是差不多的。2.訊號機制的根本是每個程序都維護著一張訊號表,通過訊號表的操作。訊號是用位圖存的,只有乙個bit。3.訊號的 需要經過核心控制,這是為了安全考慮。3.1.訊號是如...

SpringCloud 應用之間的通訊

有2種方式 1.通過 resttemlate方式 直接resttemplate物件。將url寫死即可。resttemplate resttemplate new resttemplate 從http localost 8080 msg獲取string資訊。優點 簡單直接,缺點 url寫死,耦合了。以...

Linux程序通訊

linux程序通訊 無名管道主要用於有親緣關係的程序通訊,其位於外存區域,但在檔案系統中不可見。在實際應用中,程序通訊往往發生在無關程序之間,此種情形下,若仍想使用管道,則必須使用有名管道,也稱命名管道或fifo檔案。這種型別的管道在檔案系統中可見,建立時需要指定具體路徑和檔名,管道建立之後,可用l...