Linux c 管道和有名管道(FIFO)

2021-07-10 15:08:35 字數 1670 閱讀 4493

一. 管道:

1.只能用於具有親緣關係的程序之間的通訊  

2.半雙工通訊模式

3.一種特殊的檔案,是一種只存在於核心中的讀寫函式

管道基於檔案描述符,管道建立時,有兩個檔案描述符:

a. fd[0]: 固定用於讀管道

b. fd[1]: 固定用於寫管道

建立管道:pipe()

一般步驟:1. pipe()建立管道  2. fork()建立子程序  3. 子程序會繼承父程序的管道

關閉管道:1. 逐個關閉檔案描述符  2. close()

eg. 父子程序間的管道通訊:父子程序對管道分別有自己的讀寫通道,把無關的讀端或寫段關閉。

1 #include 2 #include 3 #include 

4 #include 5 #include 6

7#define max_data_len 256

8#define delay_time 1910

int main()

2324

if ((pid=fork())<0) else

if (pid==0)

3435 close(pipe_fd[0]);

36 exit(0);

37 } else

4445 close(pipe_fd[1]);

46 waitpid(pid,null,0);

47 exit(0);

48 }

4950 }

二. 有名管道fifob. 管道建立後,兩程序可按普通檔案一樣對其操作

2. fifo遵循先進先出規則:a. 對管道讀從開始處返回資料

b. 對管道寫則把資料新增到末尾

c. 不支援如lseek()等檔案定位操作

建立有名管道:mkfifo()

建立管道成功後,可使用open()、read()和write()等函式。

為讀而開啟的管道可在open()中設定o_rdonly

為寫而開啟的管道可在open()中設定o_wronly

與普通檔案不同的是阻塞問題

•普通檔案的讀寫時不會出現阻塞問題

•在管道的讀寫中卻有阻塞的可能,

•非阻塞標誌:在open()函式中設定為o_nonblock

l阻塞開啟與非阻塞開啟

對於讀程序

•若該管道是阻塞開啟,且當前fifo內沒有資料,則對讀程序而言將一直阻塞到有資料寫入

•若該管道是非阻塞開啟,則不論fifo內是否有資料,讀程序都會立即執行讀操作。即如果fifo內沒有資料,則讀函式將立刻返回0

對於寫程序

•若該管道是阻塞開啟,則寫操作將一直阻塞到資料可以被寫入

•若該管道是非阻塞開啟而不能寫入全部資料,則讀操作進行部分寫入或者呼叫失敗

linux C 有名管道

匿名管道呢,只能使用在有親緣關係的程序之間,比如父子程序個兄弟程序,等等,因為匿名管道是乙個在記憶體中存在的檔案,其位址描述符只是在父子程序之中才有體現,為了克服該缺點,就有了命名管道的實現,命名管道呢,實際上就是乙個在檔案系統中儲存的檔案,命名管道是乙個裝置檔案,同時,該管道檔案也是fifo fi...

無名管道和有名管道

無名管道 無名管道建立 int pipe int filedis 2 當乙個管道建立時,它會建立兩個檔案描述符 filedis 0 用於讀管道,filedis 1 用於寫管道 管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道 有名管道 有...

管道 無名管道 和FIFO 有名管道

管道是最初的unixipc形式,但是因為管道沒有名字,所以它們只能用於有親緣關係的程序使用 進而有名管道 fifo 應運而生,有名管道有乙個路徑名與之關聯,所以允許無親緣關係的程序訪問同乙個fifo。以下具體介紹管道 管道的建立 管道由函式 int pipe int fd 2 建立,提供乙個單向資料...