2010-11-27 26 views
4

我在c中工作(或多或少是第一次)uni,我需要从一个字符数组中生成一个MD5。该分配指定这必须通过创建管道并在系统上执行命令md5来完成。如何在C中将字符串传入popen()命令?

我这个地步得到:

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); 

其中,我认为,将执行猫,并通过“打招呼”了进去。这是正确的吗?

+0

你有没有运行那第二块代码?如果你有,你会意识到,fwrite接受另一个参数,这是你的字符串的一个元素的大小,所以你可能已经试过fwrite(“hello”,sizeof(char),5,file);并发现这确实有效。无论你是否应该这样做,或者通过调用pipe()然后fork()一个孩子,关闭管道的末端,并用write()和sprintf()发送信息是一个不同的想法。 – prelic 2010-11-27 10:21:58

回答

2

如果你需要得到一个字符串到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.$$ 
    
0

试试这个:

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的stdout阅读,你可能会想看看周围的popen2的实现(.. )。尽管这通常不在C库中。

+0

对于哪个`md5`程序是这个有效的命令行语法? – 2010-11-27 10:07:57

+0

char * get_string_md5(char * data){ static char command [256]; snprintf(command,256,“md5 -qs'%s'”,data); FILE * md5 = popen(md5,“r”); static char result [256]; (fgets(result,256,md5)){ 返回结果; } printf(“错误:无法生成MD5散列\ n”); end(EXIT_FAILURE); } 没有工作:( – Ash 2010-11-27 10:19:36

+0

@larsmans:它可以在MacOS X 10.6.5上使用/ sbin/md5。 – 2010-11-27 16:58:29

1

见上面我的评论:

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

产生MD5和

相关问题