程序間通訊 管道

2021-08-04 16:00:11 字數 2088 閱讀 4195

管道是最初的unix ipc(程序間通訊)形式,侷限於沒有名字,從而只能由有親緣關係的程序使用。

#includeint pipe(int fd[2]);

//返回:若成功則為0,若出錯則為-1

該函式返回兩個檔案描述符:fd[0]和fd[1]。前者開啟來讀,後者開啟來寫。

管道的典型用途:為兩個不同程序(父程序和子程序)間提供通訊手段。

(1)提供乙個單向資料流的方式:由乙個程序(它將成為父程序)建立乙個管道後呼叫fork派生乙個自身的副本,父程序關閉管道的讀出端,子程序關閉同一管道的寫入端。

(2)提供乙個雙向資料流的方式:

步驟1:建立管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1])

步驟2:fork;

步驟3:父程序關閉管道1的讀出端(fd1[0])

步驟4:父程序關閉管道2的寫入端(fd2[1])

步驟5:子程序關閉管道1的寫入端(fd1[1])

步驟6:子程序關閉管道2的讀出端(fd2[0])

程式例項:

#include	"unpipc.h"

void client(int, int), server(int, int);

intmain(int argc, char **argv)

/* 4parent */

close(pipe1[0]);

close(pipe2[1]);

client(pipe2[0], pipe1[1]);

waitpid(childpid, null, 0); /* wait for child to terminate */

exit(0);

}#include    "unpipc.h"

void

client(int readfd, int writefd)

#include    "unpipc.h"

void

server(int readfd, int writefd)

else

}

#includefile *popen(const char *command,const char *type);

//返回:若成功則為檔案指標,若出錯則為null

int pclose(file *stream);

//返回:若成功則為shell的終止狀態,若出錯則為-1

標準i/o函式庫提供了popen函式,它

建立乙個管道並

啟動另外乙個程序,該程序要麼從該管道讀出標準輸入,要麼往該管道寫入標準輸出。

pclose函式關閉由popen建立的標準i/o流,等待其中的命令終止,然後返回shell的終止狀態

**例項:

#include	"unpipc.h"

intmain(int argc, char **argv)

popen()函式實際上執行以下操作:

1.使用pipe()系統呼叫建立乙個新管道

2.建立乙個新程序,該程序又執行以下操作

a.如果type是r,就把與管道的寫信道相關的檔案描述符拷貝到檔案描述符1(標準輸出);否則,如果type是w,就把與管道的讀通道相關的檔案描述符拷貝到檔案描述符   0(標準輸入)

b.關閉pipe()返回的檔案描述符

c.呼叫execve()系統呼叫執行filename所指定的程式

3.如果type是r,就關閉與管道的寫信道相關的檔案描述符;否則,如果type是w,就關閉與管道的讀通道相關的檔案描述符

4.返回file檔案指標所指向的位址,這個指標指向仍然開啟的管道所涉及的任一檔案描述符。

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...