程序通訊1 管道通訊

2021-08-07 02:01:24 字數 2548 閱讀 1125

管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。

兩個程式之間傳遞資料的一種簡單方法是使用popen和pclose。

#include 

file *popen(const

char *command, const

char *type);

int pclose(file *stream);

popen函式允許乙個程式將另乙個程式作為新程序來啟動,並可以傳遞資料給它或者通過它接收資料。command字串是要執行的程式名和相應的引數。type必須是"r"或"w"。

如果type是"r",被調程式的輸出就可以被呼叫程式使用,呼叫程式利用popen函式返回的file *檔案流指標,可以讀取被調程式的輸出;如果type是"w",呼叫程式就可以向被調程式傳送資料,而被調程式可以在自己的標準輸入上讀取這些資料。

pclose函式只在popen啟動的程序結束後才返回。如果呼叫pclose時它仍在執行,pclose將等待該程序的結束。

案例:

int main()

char buf[size] = ;

int ret = fread(buf, sizeof(char), size-1, fp);

// printf ("讀到的資料:\n %s\n", buf);

file *fp2 = popen("grep a.out", "w");

if (fp2 == null)

fwrite (buf, sizeof(char), ret, fp2);

printf ("寫入完成\n");

pclose (fp);

pclose (fp2);

return

0;}

從案例可以看出通過popen這個函式可以實現與終端語句ps -ef | grep a.out相同的功能。

管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。

無名管道由pipe()函式建立:

int pipe(int filedis[2]);

當乙個管道建立時,它會建立兩個檔案描述符:

filedis[0]用於讀管道,filedis[1]用於寫管道。

案例:

int main()

ret = write (fd[1], "hello", 5);

printf ("寫入 %d 個位元組\n", ret);

char ch;

while (1)

printf ("讀到 %d 位元組: %c\n", ret, ch);

}close (fd[0]);

close (fd[1]);

return

0;}

從案例可以看出通過pipe 這個函式,可以建立乙個管道,fd[0]用於讀,f[1]用於寫。

管道用於不同程序間通訊。通常先建立乙個管道,在通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道描述符。

案例:

void child_do(int *fd)

buf[ret] = '\0';

printf ("子程序讀到 %d 位元組資料: %s\n", ret, buf);

}// 關閉讀端

close (fd[0]);

}// 父程序通過管道向子程序傳送資料

void father_do(int *fd)

// 關閉寫端

close (fd[1]);

}int main()

// 建立子程序

pid_t pid = fork();

switch (pid)

return

0;}

在這個案例中,父程序用來寫,子程序則用來讀,這樣父子程序,就可以通過管道進行通訊了。

#include 

#include

int mkfifo(const

char *pathname, mode_t mode);

pathname: fifo檔名

mode:屬性(同檔案操作)

一旦建立了乙個fifo,就可用open開啟它,一般的檔案訪問函式(close、read、write等)都可用於fifo。

命名管道的建立比較簡單,就不多說了,下面介紹乙個用命名管道進行的資訊互動的案例:

int main()

char buf[size];

while (1)

return

0;}

int main()

char buf[size];

while (1)

return

0;}

在開啟兩個命名管道後,乙個進行讀操作,乙個進行寫操作。

關閉管道只需要將兩個檔案描述符關閉即可,可以使用普通的close函式逐個關閉。

程序通訊 1 管道

程序之間通訊的方式有很多種,主要包括 管道命名管道 訊號訊息佇列 共享記憶體 訊號量套接字 其中,管道是最早的一種程序間通訊機制,主要適用於具有親緣關係之間的程序間通訊,比如,父程序與子程序之間,或者同乙個父程序的兩個子程序之間。同時,管道是一中半雙工的通訊,資料只能單向流動,從一段寫入,另外一段讀...

程序通訊1 管道 命名管道

匿名管道 管道是一種簡單的程序通訊 ipc 機制。管道實質上就是pipe函式在核心中開闢了一段緩衝區,有乙個讀端和乙個寫端。兩個程序之間能夠通訊的本質 通過fork函式傳遞檔案描述符 子程序是父程序的副本,父程序所有開啟的檔案描述符都被複製到子程序中,父子程序的每個相同的開啟描述符共享乙個檔案表項 ...

程序間通訊(1) 管道

linux下一切皆檔案,我們可以建立乙個管道檔案進行通訊,實際上是呼叫pipe函式在核心中開闢一塊緩衝區 稱為管道 用於通訊,管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程...