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函数的功能总结。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!