管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。
兩個程式之間傳遞資料的一種簡單方法是使用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引數傳出給使用者程...