我想使用linux的" base64"脚本对数据进行编码并将其获取。当我尝试编译
时char a[200];
strcpy(a, "Hello");
printf("%s", a);
我得到输出
Hello
现在每当我尝试代码
时char a[200];
strcpy(a, system("echo Hello | base64"));
printf("%s", a);
我得到输出
aGVsbG8K
Segmentation fault
即使我删除了" printf"语句,我也会得到相同的
aGVsbG8K
Segmentation fault
我想保存
输出的值system("echo Hello | base64")
在" a"中,不显示它。请帮助
如果您阅读了system
的文档,您会发现它不会返回字符串 - 它定义为:
int system(const char *command);
返回值是命令的返回状态或-1,如果有错误。您无法使用system
获得输出 - 您运行的命令的输出将直接转到Stdout。
要从另一个命令中获取输出,您可以使用popen
。
FILE *myfile;
char buffer[1024];
myfile=popen("echo Hello | base64","r");
if(myfile)
{
while(fgets(buffer,1024,myfile))
{
printf("%s",buffer);
}
pclose(myfile);
}
在这里
strcpy(a, system("echo Hello | base64"));
system()
不存储它的结果,因为system()
作业是执行参数中提供的command
&将其打印在控制台,即stdout
缓冲区。从系统的手动页面
system()
通过调用command
中指定的命令/bin/sh -c
命令,并在命令完成后返回。
有一种解决问题的方法,即stdout
上的system()
输出,您可以将其输出重定向到文件&然后从文件&打印。例如
int main(void) {
close(1); /* stdout file descriptor is avilable now */
/* create the file if doesn't exist, if exist truncate the content to 0 length */
int fd = open("data.txt",O_CREAT|O_TRUNC|O_RDWR,0664); /* fd gets assigned with lowest
available fd i.e 1 i.e nowonwards stdout output
gets rediredcted to file */
if(fd == -1) {
/* @TODO error handling */
return 0;
}
system("echo Hello | base64"); /* system output gets stored in file */
int max_char = lseek(fd,0,2);/* make fd to point to end, get the max no of char */
char *a = malloc(max_char + 1); /* to avoid buffer overflow or
underflow, allocate memory only equal to the max no of char in file */
if(a == NULL) {
/* @TODO error handling if malloc fails */
return 0;
}
lseek(fd,0,0);/* from beginning of file */
int ret = read(fd,a,max_char);/* now read out put of system() from
file as array and print it */
if(ret == -1) {
/* @TODO error handling */
return 0;
}
a[ret] = ' ';/* terminated array */
dup2(0,fd);/*fd 0 duplicated to file descriptor where fd points i.e */
printf("output : %s n", a);
/* to avoid memory leak, free the dynamic memory */
free(a);
return 0;
}
我上面的建议是临时修复&我不建议这样做,而是按照@chris Turner的建议(http://man7.org/linux/man-pages/man3/popen.3.html)使用[popen]
popen()
函数通过创建管道,分叉,打开一个过程 和 调用外壳。由于管道是单向的,因此 类型参数可以仅指定读取或写作,而不是两者兼而有之;这 结果流相应地读取或仅写入。
例如
int main(void) {
char buf[1024];
FILE *fp = popen("echo Hello | base64","r");
printf("%sn",fgets(buf,sizeof(buf),fp));
return 0;
}