os.popen函数,popen用法

os.popen函数,popen用法,Linux中popen函数的作用小结

popen()函数通过创建管道、调用fork()生成子进程以及执行shell运行命令来启动一个进程。本文重点介绍Linux中popen函数的作用,有兴趣的朋友一起看看吧。

先简单说一下popen()函数。

函数定义

#包含stdio.h

FILE * popen(const char *命令,const char *类型);

int pclose(FILE * stream);

函数说明

popen()函数通过创建管道、调用fork()生成子进程以及执行shell运行命令来启动一个进程。此管道必须由pclose()函数关闭,而不是由fclose()函数关闭。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回到shell的终止状态。如果shell无法执行,pclose()返回的终止状态与shell已执行exit相同。

类型参数只能读或写,返回值(标准I/O流)也有与类型对应的只读或只写类型。如果type为‘r’,则文件指针连接到命令的标准输出;如果类型为“w”,则文件指针连接到命令的标准输入。

command参数是指向以null结尾的NULL命令字符串的指针。这一行将用-c标志传递给bin/sh,shell将执行这个命令。

popen()的返回值是标准的I/O流,必须用pclose终止。如前所述,这个流是单向的(它只能用于读或写)。写到这个流就相当于写了命令的标准输入,命令的标准输出和进程调用popen()是一样的;相反,从流中读取数据相当于读取命令的标准输出,命令的标准输入与调用popen()的进程相同。

返回值

如果对fork()或pipe()的调用失败,或者内存无法分配,则返回NULL否则,它将返回标准I/O流。Popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出错,errno将被设置为相应的错误类型。如果类型参数不合法,errno将返回EINVAL。

函数原型:

#包含“stdio.h”

文件*popen(常量字符*命令,常量字符*模式)

int p close(FILE * stream _ to _ close);

参数说明:

Command:是指向以null结尾的NULL命令字符串的指针。这一行将用-c标志传递给bin/sh,shell将执行这个命令。

Mode:只能是读或写中的一种,返回值(标准I/O流)也有与type对应的只读或只写类型。如果type为“R”,则文件指针连接到命令的标准输出;如果类型是“w”,文件指针连接到命令的标准输入。

作用:

popen函数允许一个程序作为一个新进程启动另一个程序,并可以通过它传递数据或接收数据。

它的内部实现是调用fork生成一个子进程,执行一个shell,运行一个命令启动一个进程,这个进程必须被pclose()函数关闭。

缺点:

使用popen的不好的影响是,每次popen调用,不仅要启动一个请求的程序,还要启动一个shell,也就是每次popen调用会多启动两个进程。

举例:

# includestdio.h

#includeunistd.h

#includestring.h

int main()

{

FILE * fp=NULL

FILE * fh=NULL

char buff[128]={ 0 };

memset(buff,0,sizeof(buff));

fp=popen('ls -l ',' r ');//通过管道将命令ls-l读取到fp

fh=fopen('shell.c ',' w ');//创建一个可写文件

fread(buff,1,127,FP);//将fp数据流读入缓冲区

fwrite(buff,1,127,FH);//将buff的数据写入fh指向的文件

pclose(FP);

fclose(FH);

返回0;

}

~

运行结果:

[lol@localhost practice]$ ls

popen popen.c壳牌

[lol @ localhost practice]$ cat shell . c

共计12人

-rwxrwxr-x . 1 lol lol 5478 5月24日15:39 popen

-rw-rw-r。1 lol lol 473月24日15:39 popen.c

-rw-rw-r。1 lol lol [lol@localhost练习]$ vim popen.c

[lol@localhost practice]$

总结

以上是边肖介绍的Linux中popen函数的功能总结。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: