APUE筆記 程序間通訊

2021-07-02 01:01:21 字數 1596 閱讀 6057

管道

#include

int pipe(int fds[2]);

fd返回兩個檔案描述符,fd[0]讀,fd[1]寫!

管道是單雙工的,只能一端寫,另一端讀,不能兩邊同時讀寫

管道實際上是在,核心中開闢了乙個迴圈佇列,

當佇列寫滿(隊空)時,繼續寫(讀)管道會阻塞當前程序!

當寫端關閉,繼續讀時返回eof

當讀端關閉,繼續寫時候傳送sigpipe訊號,預設關閉程序

可能多個程序往管道寫,若指定寫的位元組數< 管道空間大小pip_buf,則寫資料不會交叉(獨佔寫,寫是院子操作)

若指定寫的位元組數》 管道空間大小pip_buf,則寫資料可能會交叉(寫滿管道,阻塞,管道有空間,大家一起競爭寫?)                                           

pipe建立的管道只能用於有親緣關係的程序間通訊,父程序建立管道,fork子程序繼承檔案描述符,則可以父程序用fd[0]讀,子程序從fd[0]寫!

為確保,讀寫單向,讀端應該關閉寫fd[1],寫端關閉讀fd[0]

popen& pclose

#include

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

int pclose(file *fp);

open 開乙個管道,然後呼叫fork,使用exec執行cmdstr 命令

返回乙個標準i/o流,type 為「r」返回標準讀,「w」返回標準寫即fd繫結為fd[1]

注意,因為管道作為標準輸入/出,所以預設使用全緩衝,可能造成讀不到,或者寫不到資料

在讀寫之前追號設定俄為行緩衝!

管道可在程式設計時候,作為中間處理**,插入某乙個流程,作為中間處理!

fifo

管道只能用於親緣關係的程序之間通訊

fifo可以用於無關係的程序間通訊

可在磁碟中中建立乙個檔案,管道的inode會指向核心空間的,管道記憶體(迴圈佇列)

檔案的實際大小是0

通過檔案所有的程序就都能索引到管道的實際內容!

#include

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

int mkfifoat(int fd, const char *path, mode_t mode );

建立乙個fifo檔案,通過s_isfifo可以判斷是否文fifo檔案

open未指定o_nobliock(預設),讀(寫)開啟,無程序以寫(讀)開啟時,阻塞,知道有程序以寫(讀)開啟

fifo可以用來實現服務程序/客戶程序的模型

客戶以公用管道寫,大小應小於pipe_buf 以保證寫操作的原子性

服務以私有管道寫,客戶從此管道讀(注意處理sigpipe,客戶程序可能以外終止)

shell 用來將資料從一條管道送到另一條管道,無須臨時檔案???

APUE 程序間通訊

現在,某些系統提供全雙工管道,但是為了最佳的可移植性,我們決不應預先假定系統支援全雙工管道。管道只能在具有公共祖先的兩個程序之間使用。通常,乙個管道由乙個程序建立,在程序呼叫fork之後,這個管道就能在父程序和子程序之間使用了。每當在管道中鍵入乙個命令序列,讓shell執行時,shell都會為每一條...

APUE筆記 高階程序間通訊

unix 域套接字 unix域套接字,使用socket相同的介面,用於程序間通訊 但它僅僅進行資料複製,不新增報頭,不計算校驗和 unix域套接字,在系統中建立兩個檔案,檔案不實際儲存資料,指向核心空間中相應位址 使用socketpair建立乙個類似於管道的socketfd fd 2 不同於管道,此...

APUE學習筆記 23 程序間通訊之管道

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 15章。2.總結了程序間通訊的一種機 制 管道的基本概念和使用方法。3.管道 管道是unix 系統ipc 的最古老形式,在 shell 下的表現形式為管道線。每當在管道線中...