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

14 篇文章 0 订阅

纠结与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/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值