popen md5sum与命令行md5sum不一致?

时间:2016-10-19 23:00:57

标签: c file popen md5sum

我编写了一个代码来传输一个小文本文件,“mary_lamb”使用C-ZMQ到同一台机器上的一个名为“meow”的新文本文件。

传输完成后,我运行'md5sum mary_lamb'和'md5sum meow'来验证内容是否相同。 md5sums匹配完美。我还检查文件的内容,以确保它们是好的,它们是。我用'popen'编写了一些代码来对这两个文件进行md5sum验证,有趣的是输出文件(meow)的结果与输入文件mary_lamb不同,即使这两个文件是相同的。

我甚至在C中使用system()添加了一个运行md5sum的步骤以查看输出,有趣的是,这也是不正确的。程序退出后,我通过linux命令行读取md5sum,它是不同的。我确定在得到md5sum之后立即做了一个pclose(),但是这里发生了什么?我正在读取文件的事实是否有可能改变其md5sum?

以下是该计划的输出:

running system command for md5
d41d8cd98f00b204e9800998ecf8427e  meow

attempting to popen md5sum meow...
rMD5: md5_out result: d41d8cd98f00b204e9800998ecf8427e  meow

rMD5: md5_clnt value: de76ec3d1470e034b82dcb269b11f054  mary_lamb

md5sum mismatch!

以下是手动检查:

$ md5sum meow
de76ec3d1470e034b82dcb269b11f054  meow
$ md5sum mary_lamb
de76ec3d1470e034b82dcb269b11f054  mary_lamb

我还确认此机器上只有一份'meow'和'mary_lamb'。

以下是代码:

 //return 0 if eq, else other number.
 int compMD5( char *md5_clnt, char *md5_out )
 {
     char buf[256];
     int total_str_len = strlen( "md5sum" ) + strlen( md5_out ) + 2;
     char *full_command = (char*)malloc( (total_str_len * sizeof(char*)) + 1 );
     //copy strings into full_command string
     snprintf( full_command, total_str_len, "%s %s", "md5sum", md5_out );

     printf( "running system command for md5\n" );
     system( full_command );

     printf( "attempting to popen %s \n", full_command );
     FILE *md5 = popen( full_command, "r" );

     while( fgets(buf, sizeof(buf), md5 ) != 0 );
     md5_out = buf;
     printf( "rMD5: md5_out result: %s\n", md5_out );
     printf( "rMD5: md5_clnt value: %s\n", md5_clnt );
     pclose( md5 );
     return strcmp( md5_out, md5_clnt );
}

建议,想法,意见,欢迎所有人。

谢谢!

0 个答案:

没有答案