进程的创建--popen

poen函数允许一个程序将另一个程序作为新进程来启动,并可以传递数据给它或者通过它接收数据.

二、使用popen函数
1、popen函数和pclose函数介绍
有静就有动,有开就有关,与此相同,与popen函数相对应的函数是pclose函数,它们的原型如下:
  1. #include <stdio.h>  
  2. FILE* popen (const char *command, const char *open_mode);  
  3. 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的详细应用会在后面管道中做总结,此处只做了解即可。

posted @ 2017-02-28 16:08  ren_zhg1992  阅读(550)  评论(0)    收藏  举报