新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 进程间通信之:管道

进程间通信之:管道

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257127.htm

8.2.4标准流

1.标准流函数说明

的文件操作中有基于文件流的标准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的标准输出,即该命令的结果产生输出
“w”:文件指针连接到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教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理




评论


相关推荐

技术专区

关闭