分段故障



我想使用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;
}

相关内容

  • 没有找到相关文章