管道实例:获取system()调用的buffer

来源:互联网 发布:vb与三菱plc通讯 编辑:程序博客网 时间:2024/06/10 03:01

纠结与system()调用后不能得到其输出到标准控制台的buffer。实现二法:

/*===============================================================*   Copyright (C) 2011 All rights reserved.*   *   文件名称:system_buf.c*   创 建 者:咼良兵*   创建日期:2011年11月20日*   描    述:**   更新日志:*================================================================*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>static int system_with_buff(const char* cmd, char* buf, int bufsize){    int fd[2] = {0};    int pid = 0;    if (pipe(fd) != 0){        fprintf(stderr, "create pipe fail: %s\n", strerror(errno));        return -1;    }    if ((pid = fork()) == 0){ /*child */        int fd_child[2];        if(pipe(fd_child) != 0){            fprintf(stderr, "create pipe fail: %s\n", strerror(errno));            exit(1);        }        close(STDOUT_FILENO);        dup2(fd_child[1], 1);        system(cmd);        read(fd_child[0], buf, bufsize);        write(fd[1], buf, bufsize);        exit(0);    }    read(fd[0], buf, bufsize);    close(fd[0]);    close(fd[1]);    return 0;}int main(void){#if 1    char buf[20] = {0};    system_with_buff("pwd", buf, 20);    printf("ret: %s\n", buf);#endif#if 0    /*如下代码能做到相同的事,他弊端何处? 破坏了些什么? 如何修正*/     char buf[20] = {0};    int fd_child[2];    if(pipe(fd_child) != 0){        fprintf(stderr, "create pipe fail: %s\n", strerror(errno));        exit(1);    }    close(STDOUT_FILENO);    dup2(fd_child[1], 1);       system("pwd");        read(fd_child[0], buf, 20);    close(fd_child[1]);    fprintf(stderr,"ret: %s\n", buf);        /*printf("ret: %s\n", buf);    */ /*print nothing*/#endif    return 0;}

参考:http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/