本文關(guān)鍵字: linux 管道通信,linux 進(jìn)程通信方式 ,標(biāo)準(zhǔn)流管道
1.標(biāo)準(zhǔn)流管道函數(shù)說明
與Linux的文件操作中有基于文件流的標(biāo)準(zhǔn)I/O操作一樣,管道的操作也支持基于文件流的模式。這種基于文件流的管道主要是用來創(chuàng)建一個連接到另一個進(jìn)程的管道,這里的“另一個進(jìn)程”也就是一個可以進(jìn)行一定操作的可執(zhí)行文件,例如,用戶執(zhí)行“l(fā)s -l”或者自己編寫的程序“./pipe”等。由于這類操作很常用,因此標(biāo)準(zhǔn)流管道就將一系列的創(chuàng)建過程合并到一個函數(shù)popen()中完成。它所完成的工作有以下幾步:
● 創(chuàng)建一個管道。
● fork()一個子進(jìn)程。
● 在父子進(jìn)程中關(guān)閉不需要的文件描述符。
● 執(zhí)行exec函數(shù)族調(diào)用。
● 執(zhí)行函數(shù)中所指定的命令。
這個函數(shù)的使用可以大大減少代碼的編寫量,但同時也有一些不利之處。例如,它不如前面管道創(chuàng)建的函數(shù)那樣靈活多樣,并且用popen()創(chuàng)建的管道必須使用標(biāo)準(zhǔn)I/O函數(shù)進(jìn)行操作,但不能使用前面的read()、write()一類不帶緩沖的I/O函數(shù)。
與之相對應(yīng),關(guān)閉用popen()創(chuàng)建的流管道必須使用函數(shù)pclose()。該函數(shù)關(guān)閉標(biāo)準(zhǔn)I/O流,并等待命令執(zhí)行結(jié)束。
2.函數(shù)格式
popen()和pclose()函數(shù)語法要點(diǎn)如表1和表2所示。
表1 popen()函數(shù)語法要點(diǎn)
所需頭文件 |
#include <stdio.h> |
函數(shù)原型 |
FILE *popen(const char *command, const char *type) |
函數(shù)傳入值 |
command:指向的是一個以null結(jié)束符結(jié)尾的字符串,這個字符串包含一個shell命令,并被送到/bin/sh以-c參數(shù)執(zhí)行,即由shell來執(zhí)行 |
type |
“r”:文件指針連接到command的標(biāo)準(zhǔn)輸出,即該命令的結(jié)果產(chǎn)生輸出
“w”:文件指針連接到command的標(biāo)準(zhǔn)輸入,即該命令的結(jié)果產(chǎn)生輸入
|
函數(shù)返回值 |
成功:文件流指針 |
出錯:-1 |
表2 pclose()函數(shù)語法要點(diǎn)
所需頭文件 |
#include <stdio.h> |
函數(shù)原型 |
int pclose(FILE *stream) |
函數(shù)傳入值 |
stream:要關(guān)閉的文件流 |
函數(shù)返回值 |
成功:返回由popen()所執(zhí)行的進(jìn)程的退出碼 |
出錯:-1 |
3.使用實(shí)例
在該實(shí)例中,使用popen()來執(zhí)行“ps -ef”命令?梢钥闯觯琾open()函數(shù)的使用能夠使程序變得短小精悍。
/* standard_pipe.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 1024
int main()
{
FILE *fp;
char *cmd = "ps -ef";
char buf[BUFSIZE];
if ((fp = popen(cmd, "r")) == NULL) /* 調(diào)用popen()函數(shù)執(zhí)行相應(yīng)的命令 */
{
printf("Popen error\n");
exit(1);
}
while ((fgets(buf, BUFSIZE, fp)) != NULL)
{
printf("%s",buf);
}
pclose(fp);
exit(0);
}
下面是該程序在目標(biāo)板上的執(zhí)行結(jié)果。
$ ./standard_pipe
PID TTY Uid Size State Command
1 root 1832 S init
2 root 0 S [keventd]
…
74 root 1284 S ./standard_pipe
75 root 1836 S sh -c ps -ef
76 root 2020 R ps –ef
本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》
熱點(diǎn)鏈接:
1、無名管道系統(tǒng)調(diào)用
2、Linux下進(jìn)程間通信方式-管道
3、Linux下進(jìn)程間通信
4、實(shí)驗(yàn):編寫守護(hù)進(jìn)程
5、實(shí)驗(yàn):編寫多進(jìn)程程序
更多新聞>> |