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