進程間通信之:管道
8.2.4標準流管道
1.標準流管道函數說明
與Linux的文件操作中有基于文件流的標準I/O操作一樣,管道的操作也支持基于文件流的模式。這種基于文件流的管道主要是用來創建一個連接到另一個進程的管道,這里的“另一個進程”也就是一個可以進行一定操作的可執行文件,例如,用戶執行“ls-l”或者自己編寫的程序“./pipe”等。由于這一類操作很常用,因此標準流管道就將一系列的創建過程合并到一個函數popen()中完成。它所完成的工作有以下幾步。
n 創建一個管道。
n fork()一個子進程。
n 在父子進程中關閉不需要的文件描述符。
n 執行exec函數族調用。
n 執行函數中所指定的命令。
這個函數的使用可以大大減少代碼的編寫量,但同時也有一些不利之處,例如,它不如前面管道創建的函數那樣靈活多樣,并且用popen()創建的管道必須使用標準I/O函數進行操作,但不能使用前面的read()、write()一類不帶緩沖的I/O函數。
與之相對應,關閉用popen()創建的流管道必須使用函數pclose()來關閉該管道流。該函數關閉標準I/O流,并等待命令執行結束。
2.函數格式
popen()和pclose()函數格式如表8.2和表8.3所示。
表8.2 popen()函數語法要點
所需頭文件 | #includestdio.h> | |
函數原型 | FILE*popen(constchar*command,constchar*type) | |
函數傳入值 | command:指向的是一個以null結束符結尾的字符串,這個字符串包含一個shell命令,并被送到/bin/sh以-c參數執行,即由shell來執行 | |
type: | “r”:文件指針連接到command的標準輸出,即該命令的結果產生輸出 | |
函數返回值 | 成功:文件流指針 | |
出錯:-1 |
表8.3 pclose()函數語法要點
所需頭文件 | #includestdio.h> |
函數原型 | intpclose(FILE*stream) |
函數傳入值 | stream:要關閉的文件流 |
函數返回值 | 成功:返回由popen()所執行的進程的退出碼 |
出錯:-1 |
3.函數使用實例
在該實例中,使用popen()來執行“ps-ef”命令。可以看出,popen()函數的使用能夠使程序變得短小精悍。
/*standard_pipe.c*/
#includestdio.h>
#includeunistd.h>
#includestdlib.h>
#includefcntl.h>
#defineBUFSIZE1024
intmain()
{
FILE*fp;
char*cmd=ps-ef;
charbuf[BUFSIZE];
/*調用popen()函數執行相應的命令*/
if((fp=popen(cmd,r))==NULL)
{
printf(Popenerrorn);
exit(1);
}
while((fgets(buf,BUFSIZE,fp))!=NULL)
{
printf(%s,buf);
}
pclose(fp);
exit(0);
}
下面是該程序在目標板上的執行結果。
$./standard_pipe
PIDTTYUidSizeStateCommand
1root1832Sinit
2root0S[keventd]
3root0S[ksoftirqd_CPU0]
……
74root1284S./standard_pipe
75root1836Ssh-cps-ef
76root2020Rps–ef
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)linux相關文章:linux教程
數字通信相關文章:數字通信原理
通信相關文章:通信原理
評論