进程间通信之:管道
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教程
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论