linux程序和程序之間有多種通訊方式。linux程序間通訊的主要方式有:
1、 無名管道
2、 有名管道
3、 訊號
4、 訊息佇列
5、 共享記憶體
6、 訊號量
7、 套接字
管道操作是比較簡單的通訊方式,乙個程序往管道中寫入資料,另乙個程序從管道中讀出資料。管道包括無名管道和有名管道。前者只能用於父程序和子程序間的通訊,後者可用於任意兩個程序之間。
有名管道又稱為fifo檔案,有名管道一旦建立完成後,linux會建立乙個檔案,對檔案進行讀寫,程序間就進行資料的通訊了。
fifo檔案和普通檔案有些區別:
1、 讀取fifo檔案的程序只能以rdonly的方式開啟
2、 寫fifo檔案的程序只能以wronly的方式開啟
3、 fifo檔案裡面的內容被讀取後,就消失了,但是普通檔案裡面的內容不會讀取後就消失了
對於有名管道的學習,還是用函式,不過重點是兩個函式,乙個是建立管道,乙個是刪除管道。因為管道是對應檔案,所以對於管道的操作是對檔案的操作,使用的方法和對檔案操作的方法一致。
5.2 建立有名管道
5.2.1 函式名
mkfifo
5.2.2 函式原形
int mkfifo(const char *pathname, mode_t mode)
5.2.3 函式功能
建立有名管道(fifo檔案)
5.2.4 所屬標頭檔案
5.2.5 返回值
成功:fifo檔案的檔案描述符
失敗: -1
5.2.6 引數說明
pathname: 要建立的fifo的檔名(帶路徑)
mode: 建立的檔案的許可權
0777: rwxrwxrwx
0666: rw-rw-rw-
5.3 刪除有名管道
5.3.1 函式名
unlink
5.3.2 函式原形
int unlink(const char *pathname)
5.3.3 函式功能
刪除檔案(包括fifo檔案)
5.3.4 所屬標頭檔案
5.3.5 返回值
成功:0
失敗:-1
5.3.6 引數說明
pathname: 要刪除的fifo的檔名(帶路徑)
下面,就要用寫**來學習有名管道程式設計。
編寫兩個程式,乙個程式負責建立有名管道,並往有名管道中寫資料,另乙個程式負責讀取有名管道資料,並刪除有名管道。
對應寫程序:
執行程式
可以看到,程式被阻塞掉了,因為程式在等待其他程序讀取fifo檔案內容。在目錄下多乙個fifo.txt的檔案,這個就是建立的fifo檔案。檢視這個檔案,裡面就有寫入的資料。
對於讀程序:
執行程式:
寫程序執行結束,因為有程序從fifo檔案中讀取資料,寫程序不再被阻塞。讀程序讀取fifo檔案資料成功。
下面改一下讀程序的**,讀完資料後,不刪除fifo檔案。
執行程式:
發現,fifo檔案沒有被刪除掉。但是檔案中,已經沒有內容了,因為被讀走了。
Linux有名管道程式設計
有名管道可以用於任何兩個程式間通訊,因為有名字可引用。注意管道都是單向的,因此雙方通訊需要兩個管道。下面分別是這兩個程式 同樣是lucy先執行,然後是peter。fifolucy.c include include include include include include include in...
管道及有名管道
管道和有名管道是最早的程序間通訊機制之一,管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。認清管道和有名管道的讀寫規則是在程式中應用它們的關鍵,本文在詳細討論了管道和有名管道的通訊機制的基礎上,用例項對其讀寫規則進...
無名管道和有名管道
無名管道 無名管道建立 int pipe int filedis 2 當乙個管道建立時,它會建立兩個檔案描述符 filedis 0 用於讀管道,filedis 1 用於寫管道 管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道 有名管道 有...