linux的程序間通訊

2021-09-14 04:44:32 字數 2732 閱讀 6644

概念:管道是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞

特性:

管道採用半雙工通訊方式。因此,資料只能在乙個方向上流動

只能在有公共祖先的程序間使用管道

資料一旦被讀走,便不在管道中存在,不可反覆讀取       

1 #include 2 #include 3 #include 4 #include 5 #include 6 

7 void err_sys(const char *str)

8 12

13 int main()

14 28 else if (0 == pid)

29

35 else

36

42 43 return 0;

44 }

常見的操作:建立乙個連線到另乙個程序的管道,然後讀其輸出或向其輸入端傳送資料

應用:最常見的應用是在c語言裡將shell命令的返回值在c語言裡解析;

#include

file *popen(const char *cmdstring, const char *type);

int pclose(file *fp);

待寫:popen的用法

概念:fifo又名有名管道或命名管道,

介面:

#include

#include

int mkfifo(const char *pathname, mode_t mode);

fifo與管道:

和管道一樣,fifo僅提供半雙工的資料通訊,即只支援單向的資料流;

與管道最大的不同:管道只能用於具有親緣關係的程序間的通訊,fifo可以支援任意兩個程序間的通訊

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 

9 #define fifo_path "/home/wooya/fifo"

10 11 int main()

12 18

19 if (0 == fork())

20

29 30 sleep(3);

31 int writefd = open(fifo_path, o_wronly);

32 printf("parent open fifo success\n");

33 char *temp = "i love you";

34 write(writefd, temp, strlen(temp) + 1);

35 close(writefd);

36 }

概念:訊息佇列是訊息的鍊錶,儲存在核心中,由訊息佇列識別符號標識;

介面:

msgget():函式該函式用來建立和訪問乙個訊息佇列

原型:int msgget(key_t key, int msg***);

msgsnd()函式該函式用來把訊息新增到訊息佇列中;

原型:int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msg***);

msgrcv()函式該函式用來從乙個訊息佇列獲取訊息;

原型:int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msg***);

msgctl()函式該函式用來控制訊息佇列,它與共享記憶體的shmctl函式相似

原型:int msgctl(int msgid, int command, struct msgid_ds *buf);

概念:防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,它是乙個計數器,用於為多個程序提供對共享資料物件的訪問;

介面:semget()函式它的作用是建立乙個新訊號量或取得乙個已有訊號量;

semop()函式它的作用是改變訊號量的值;

semctl()函式該函式用來直接控制訊號量資訊;

概念:共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,就好像它們是由用c語言函式malloc()分配的記憶體一樣

介面:shmat()函式第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat()函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的位址空間;

shmdt()函式該函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用;

shmctl()函式與訊號量的semctl()函式一樣,用來控制共享記憶體;

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...