推荐使用------blog.csdn.net/yyyyyyyyyywwwwwwwwww/article/details/47829927
下面这种方法太麻烦不说,多次调用getResultFromSystemCall还有可能出错:加载库失败.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
static int getResultFromSystemCall(const char* pCmd, char* pResult, int size)
{
int fd[2];
if(pipe(fd)) {
printf("pipe error!\n");
return-1;
}
//prevent content in stdout affect result
fflush(stdout);
//hide stdout
int bak_fd = dup(STDOUT_FILENO);
int new_fd = dup2(fd[1], STDOUT_FILENO);
//the output of `pCmd` is write into fd[1]
system(pCmd);
read(fd[0], pResult, size-1);
pResult[strlen(pResult)-1] = 0;
//resume stdout
dup2(bak_fd, new_fd);
return 0;
}
int main(void)
{
char* filePath = "./test";
char res[100] = {0};
char cmd[100] = {0};
sprintf(cmd,"cat %s ", filePath);
getResultFromSystemCall(cmd, res, sizeof(res)/sizeof(res[0])); //输出test内容
//getResultFromSystemCall("ls /", res, sizeof(res)/sizeof(res[0])); //输出根目录内容
printf("result is [%s]\n", res);
return 0;
}
下面这种方法太麻烦不说,多次调用getResultFromSystemCall还有可能出错:加载库失败.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
static int getResultFromSystemCall(const char* pCmd, char* pResult, int size)
{
int fd[2];
if(pipe(fd)) {
printf("pipe error!\n");
return-1;
}
//prevent content in stdout affect result
fflush(stdout);
//hide stdout
int bak_fd = dup(STDOUT_FILENO);
int new_fd = dup2(fd[1], STDOUT_FILENO);
//the output of `pCmd` is write into fd[1]
system(pCmd);
read(fd[0], pResult, size-1);
pResult[strlen(pResult)-1] = 0;
//resume stdout
dup2(bak_fd, new_fd);
return 0;
}
int main(void)
{
char* filePath = "./test";
char res[100] = {0};
char cmd[100] = {0};
sprintf(cmd,"cat %s ", filePath);
getResultFromSystemCall(cmd, res, sizeof(res)/sizeof(res[0])); //输出test内容
//getResultFromSystemCall("ls /", res, sizeof(res)/sizeof(res[0])); //输出根目录内容
printf("result is [%s]\n", res);
return 0;
}