Linux程序間通訊

2021-07-24 20:35:53 字數 2126 閱讀 3419

一、無名管道

- 無名管道時半雙工的,就是對於乙個管道來講,只能讀或者寫

- 無名管道只能在相關、有共同祖先的程序間使用

- 乙個fork或者exec呼叫建立的子程序繼承了父程序的檔案描述符

1,開啟和關閉管道

int pipe(int filedes[2]);

//在你從乙個管道中讀寫,管道必須存在

//如果成功建立管道,則會開啟兩個檔案描述符,並把它們的值儲存在乙個數值

//第乙個檔案描述符用於讀資料,第二個檔案描述符用於寫資料

//出錯返回-1,同時設定errno

//關閉乙個管道用close()函式

//不能兩端進行讀寫

/*讀寫無名管道例子*/

int main()

close(fd[0]);

}else

return0;}

二、有名管道(fifo)

- 有名管道是持久穩定的

- 它們存在於檔案系統中

- 可以讓無關聯的程序之間通訊

1,用shell命令建立有名管道mkfifo [option] name

#mkfifo fifo1 //建立乙個有名管道

#cat < fifo1 //通過cat向管道讀取資料

#ls > fifo1 //通過ls向管道輸出資料

2,函式建立fifo

int mkfifo(const

char *pathname,mode_t mode)

//函式執行成功返回0,否則返回-1,並設定變數errno

int unlink(const

char*pathname)

//刪除fifo檔案,執行成功返回0,否則返回-1,並設定變數errno

int main()

3,讀寫fifo檔案

//讀fifo例子

int main()

close(fd);

return0;}

//寫fifo例子

int main()

close(fd);

return0;}

4,共享記憶體

- 共享記憶體是核心處於在多個程序之間交換

資訊二留出的一塊記憶體區

- 如果段的許可權設定恰當,每個要訪問該段

記憶體的程序都可以把它映像到自己的私有空間

- 如果乙個程序更新了段中的資料,其他程序也

會立即看到更新

- 由乙個程序建立的段,也可以由另乙個程序讀寫

- 每個程序都把自己對共享程序記憶體的映像放到自

己的記憶體空間

1)建立共享記憶體區

#include

#include

int shmget(key_t key,size_t size,int shm_***);

//引數key既可以是ipc_private,也可以是ftok函式返回的乙個關鍵字

//引數size指定段的大小。

//引數flag:八進位制數,0***。轉化為二進位制許可權

//shmget成功返回段標示符,失敗返回-1。

int shmctl(id, ipc_rmid, 0);

//刪除共享記憶體的函式

/*建立共享記憶體區*/

int main()

2)附加共享記憶體區

void *shmat (int shmid,const

void *shmaddr,int shmfg );

//引數shmid是要附加的共享記憶體標示符

//總是把引數shmaddr設定為0

//引數shm***可以為shm_rdonly,這意味著附加段是唯讀

int shmdt (const

void *shmaddr );

/*附加,釋放共享記憶體區*/

int main(int argc,char *args)

return0;}

3)讀寫共享記憶體區

/*附加,釋放共享記憶體區*/

int main(int argc,char *args)

if(atoi(args[2] == 2)//read shared mem

shmdt(shmbuf);

}return

0;}

Linux程序間通訊

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

Linux程序間通訊

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

Linux程序間通訊

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