Linux管道popen和pclose

标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行,这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程。
popen函数还创建一个管道用于父子进程间通信,父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数。

FILE * popen( const char * command,const char * type);

函数功能:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。 依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针,随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。
返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。

int pclose(FILE * stream);

函数功能:pclose()用来关闭由popen所建立的管道及文件指针,参数stream为先前由popen()所返回的文件指针。
返回值:若成功返回shell的终止状态(也即子进程的终止状态),若出错返回-1,错误原因存于errno中。

#include 
#include 

#define BUF_SIZE 256
int main(int argc, char**argv){
    FILE *read_fp;
    char buf[BUF_SIZE];
    memset(buf, 0, sizeof(buf));
    read_fp = popen("uname -a","r");
    if(read_fp == NULL){
        perror("popen:");
        return -1;
    }
    int len = fread(buf,1,BUF_SIZE,read_fp);
    if(len <= 0){
        perror("fread:");
        pclose(read_fp);
        return -1;
    }
    printf("len = %d,buf = %s\n",len,buf);
    pclose(read_fp);
    return 0;
}

你可能感兴趣的:(linux)