我正在尝试使用execlp()
编写程序,以将字符串的md5sum的输出保存到标准输出。基本上,模拟这个:
echo "Hello!" | md5sum
获得此输出:
31ebdfce8b77ac49d7f5506dd1495830 -
以下是我首先尝试解决的问题:
char string[] = "Hello!";
execlp("md5sum", "md5sum", string, NULL);
虽然,以这种方式使用execlp()
期望参数是文件,而不是字符串。所以我试过这个:
char string[] = "Hello!";
execlp("echo", "echo", string, "md5sum", NULL);
虽然,这会产生Hello! md5sum
的输出。它将"md5sum"
识别为字符串,而不是系统调用。
我可以做些什么来使echo和md5sum一起合作?或者我该怎么做才能使md5sum在字符串上工作,而不是文件?也许我应该使用与execlp()
不同的功能?
答案 0 :(得分:0)
在我回答你的问题之前,有些担忧。
MD5很长很长很久以来就已经破了。创建具有给定MD5总和的文件是相当简单的。 SHA1正在走出困境。使用SHA-256或更好。如果您的申请不是关于安全性的,那么您和我没有资格做出关于攻击面的决定并不重要,不要冒风险。
您是否考虑过使用C进行校验和?它将更快,更便携,更可靠。有any number of checksum libraries。 Gnome Lib provides checksums等等。
#include <stdio.h>
#include <glib.h>
int main() {
char string[] = "Hello!";
printf("checksum for %s is %s\n",
string,
g_compute_checksum_for_string(G_CHECKSUM_SHA256, string, -1)
);
}
好的,关于这个问题。
第一个问题是md5sum
不接受字符串,它需要一个文件。这与execlp
无关,这是md5sum程序的工作原理。你可以从stdin中读取md5sum,但这涉及到管道,而且我想要更多。我提到过使用图书馆吗?
这会导致您的第二个问题:错误检查。我没有看到任何。任何错误检查exec
都会立即执行;如果成功则调用程序将立即退出。
然后问题是execlp
可能有点过分,除非您正在更改正在运行的程序的名称。使用execvp
。我更喜欢它,因为它将所有程序的参数保存在一个很好的列表中,可以在以后用于错误检查。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main() {
char *args[] = { "md5um", "Hello!", NULL };
int exit_status = execvp(args[0], args);
fprintf(stderr, "executing %s ", args[0]);
for( int i = 1; args[i] != NULL; i++ ) {
fprintf(stderr, "%s ", args[i]);
}
fprintf(stderr, "exited with %d: %s\n", exit_status, strerror(errno));
}