本帖最后由 sdnumcu 于 2013-9-8 10:45 编辑
本文关键字: linux 管道通信,linux 进程通信方式 ,标准流管道 1.标准流管道函数说明 与Linux的文件操作中有基于文件流的标准I/O操作一样,管道的操作也支持基于文件流的模式。这种基于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进行一定操作的可执行文件,例如,用户执行“ls -l”或者自己编写的程序“./pipe”等。由于这类操作很常用,因此标准流管道就将一系列的创建过程合并到一个函数popen()中完成。它所完成的工作有以下几步: ● 创建一个管道。
● fork()一个子进程。
● 在父子进程中关闭不需要的文件描述符。
● 执行exec函数族调用。
● 执行函数中所指定的命令。 这个函数的使用可以大大减少代码的编写量,但同时也有一些不利之处。例如,它不如前面管道创建的函数那样灵活多样,并且用popen()创建的管道必须使用标准I/O函数进行操作,但不能使用前面的read()、write()一类不带缓冲的I/O函数。 与之相对应,关闭用popen()创建的流管道必须使用函数pclose()。该函数关闭标准I/O流,并等待命令执行结束。 2.函数格式 popen()和pclose()函数语法要点如表1和表2所示。 表1 popen()函数语法要点 所需头文件 | #include <stdio.h> | 函数原型 | FILE *popen(const char *command, const char *type) | 函数传入值 | command:指向的是一个以null结束符结尾的字符串,这个字符串包含一个shell命令,并被送到/bin/sh以-c参数执行,即由shell来执行 | type | “r”:文件指针连接到command的标准输出,即该命令的结果产生输出
“w”:文件指针连接到command的标准输入,即该命令的结果产生输入 | 函数返回值 | 成功:文件流指针 | 出错:-1 |
表2 pclose()函数语法要点 所需头文件 | #include <stdio.h> | 函数原型 | int pclose(FILE *stream) | 函数传入值 | stream:要关闭的文件流 | 函数返回值 | 成功:返回由popen()所执行的进程的退出码 | 出错:-1 |
3.使用实例 在该实例中,使用popen()来执行“ps -ef”命令。可以看出,popen()函数的使用能够使程序变得短小精悍。 /* 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) /* 调用popen()函数执行相应的命令 */
{
printf("Popen error\n");
exit(1);
}
while ((fgets(buf, BUFSIZE, fp)) != NULL)
{
printf("%s",buf);
}
pclose(fp);
exit(0);
} 下面是该程序在目标板上的执行结果。 $ ./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
|