进程的创建--popen
poen函数允许一个程序将另一个程序作为新进程来启动,并可以传递数据给它或者通过它接收数据.
二、使用popen函数
1、popen函数和pclose函数介绍
有静就有动,有开就有关,与此相同,与popen函数相对应的函数是pclose函数,它们的原型如下:
- #include <stdio.h>
- FILE* popen (const char *command, const char *open_mode);
- int pclose(FILE *stream_to_close);
command是要运行的程序名和相应的参数。
open_mode只能是"r(只读)"和"w(只写)"的其中之一。
注意,popen函数的返回值是一个FILE类型的指针,而Linux把一切都视为文件,也就是说我们可以使用stdio I/O库中的文件处理函数来对其进行操作。
如果open_mode是"r",主调用程序就可以使用被调用程序的输出,通过函数返回的FILE指针,就可以能过stdio函数(如fread)来读取程序的输出;
如果open_mode是"w",主调用程序就可以向被调用程序发送数据,即通过stdio函数(如fwrite)向被调用程序写数据,而被调用程序就可以在自己的标准输入中读取这些数据。
pclose函数用于关闭由popen创建出的关联文件流。pclose只在popen启动的进程结束后才返回,如果调用pclose时被调用进程仍在运行,pclose调用将等待该进程结束。它返回关闭的文件流所在进程的退出码。
栗子:
了解重定向是怎么实现的
使用popen调用ls -l,并且建立一个管道读取输出
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> main() { char buf[1024]; FILE *f=popen("ls -l","r");//只读r或只写w int fd=fileno(f);//文件转换成文件描述符 int r; printf("=============\n"); while((r=read(fd,buf,1024))>0) { buf[r]=0; printf("::%s\n",buf); } printf("=============\n"); close(fd); pclose(f); }
popen的详细应用会在后面管道中做总结,此处只做了解即可。