我编写了一个代码来传输一个小文本文件,“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 );
}
建议,想法,意见,欢迎所有人。
谢谢!