一. 管道:
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二. 有名管道fifob. 管道建立後,兩程序可按普通檔案一樣對其操作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 }
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 建立,提供乙個單向資料...