我正在尝试从C程序中执行shell命令。
为此,我构建了一个包装器函数,它将返回命令本身的退出代码,并使用参数引用变量来返回程序的实际输出。
exec函数包装器如下所示:
int _exec(const void *command, char **result) {
FILE *fp;
char path[1035];
char *eof;
/* Open the command for reading. */
fp = popen(command, "r");
if (fp == NULL) {
return -1;
}
while((eof = fgets(path, sizeof(path), fp)) != NULL);
/* Fill the parameter reference */
*result = strdup(path);
/* close */
pclose(fp);
return 0;
}
调用部分如下所示:
int result = 0;
char *tmp;
result =_exec("ls /", &tmp);
printf("%s", tmp);
不幸的是,在调用部分中,当我printf
tmp
时,它只包含命令输出的最后一行。
知道我做错了什么吗?如何将所有行转换为*result
并因此转换为tmp
?
答案 0 :(得分:2)
使用fread
代替fgets
。 fgets
停止阅读每个换行符,但您将所有行保存在path
缓冲区的第一个位置。此外,您需要跟踪path
中已存在的字节数,并在每次调用读取函数时将数据保存到path
中的第一个未使用位置。