带有 echo 和 md5sum 的 Execlp

Execlp with echo and 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() 不同的函数?

在我回答你的问题之前,有些顾虑。

而且 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 程序的工作方式。您可以使 md5sum 从 stdin 读取,但这涉及到管道并且更多,我想继续。我有提到使用图书馆吗?

这导致了你的第二个问题:错误检查。我没有看到任何。 exec 的任何错误检查都会在 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));
}