使用echo和md5sum执行execlp

时间:2016-10-15 00:27:37

标签: c bash md5sum

我正在尝试使用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()不同的功能?

1 个答案:

答案 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));
}