【问题标题】:How Do I Pipe a String Into a popen() Command in C?如何在 C 中将字符串传递到 popen() 命令中?
【发布时间】:2011-05-16 12:21:58
【问题描述】:

我正在为 uni 使用 c(或多或少是第一次),我需要从字符数组生成 MD5。分配指定这必须通过创建管道并在系统上执行md5 命令来完成。

我已经走到这一步了:

FILE *in;
extern FILE * popen();
char buff[512];

/* popen creates a pipe so we can read the output
 * of the program we are invoking */
char command[260] = "md5 ";
strcat(command, (char*) file->name);
if (!(in = popen(command, "r"))) {
    printf("ERROR: failed to open pipe\n");
    end(EXIT_FAILURE);
}

现在这很好用(对于需要为文件获取 MD5 的任务的另一部分),但我无法锻炼如何将字符串导入其中。

如果我理解正确,我需要这样做:

FILE * file = popen("/bin/cat", "w");
fwrite("hello", 5, file);
pclose(file);

我认为它会执行 cat,并通过 StdIn 将“hello”传递给它。是这样吗?

【问题讨论】:

  • 你运行了第二个块代码吗?如果你有,你会意识到 fwrite 需要另一个参数,它是你的字符串元素的大小,所以你可能会尝试 fwrite("hello",sizeof(char),5,file);并发现这确实有效。无论您是应该这样做还是通过调用 pipe() 然后 fork() 一个孩子,关闭管道的末端,并使用 write() 和 sprintf() 发送信息是一个不同的想法.

标签: c unix md5 popen


【解决方案1】:

如果您需要将字符串输入md5 程序,那么您需要知道您的md5 程序使用哪些选项。

  • 如果它在命令行上显式地接受一个字符串,那么使用它:

    md5 -s 'string to be hashed'
    
  • 如果在命令行没有给出文件名的情况下采用标准输入,则使用:

    echo 'string to be hashed' | md5
    
  • 如果它绝对坚持一个文件名并且你的系统支持/dev/stdin/dev/fd/0,那么使用:

    echo 'string to be hashed' | md5 /dev/stdin
    
  • 如果以上都不适用,那么您必须在磁盘上创建一个文件,在其上运行md5,然后删除该文件:

    echo 'string to be hashed' > file.$$; md5 file.$$; rm -f file.$$
    

【讨论】:

  • +1,说明在某些系统上,该程序称为md5sum
【解决方案2】:

见我上面的评论:

FILE* file = popen("/sbin/md5","w");
fwrite("test", sizeof(char), 4, file);
pclose(file);

产生一个 md5 和

【讨论】:

  • 好的,但是我如何取回字符串 - 目前,您的代码有效,但它会将其打印到屏幕上 - 我需要将其作为 char* 取回
【解决方案3】:

试试这个:

static char command[256];
snprintf(command, 256, "md5 -qs '%s'", "your string goes here");
FILE* md5 = popen(md5, "r");
static char result[256];
if (fgets(result, 256, md5)) {
     // got it
}

如果您真的想将它写入 md5 的标准输入,然后从 md5 的标准输出读取,您可能会想四处寻找 popen2(...) 的实现。不过,这通常不在 C 库中。

【讨论】:

  • char* get_string_md5(char* data) { 静态字符命令[256]; snprintf(command, 256, "md5 -qs '%s'", 数据);文件* md5 = popen(md5, "r");静态字符结果[256]; if (fgets(result, 256, md5)) { 返回结果; } printf("错误:生成 MD5 哈希失败\n");结束(EXIT_FAILURE); } 不起作用:(
  • @larsmans:它可以与 MacOS X 10.6.5 上的 /sbin/md5 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2011-12-05
  • 2012-11-21
  • 2023-03-04
  • 2012-06-24
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多