繁体   English   中英

使用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的输出Hello! md5sum Hello! md5sum 它将"md5sum"识别为字符串,而不是系统调用。

我该怎么做才能使echo和md5sum一起合作? 或者我该怎么做才能使md5sum在字符串上工作,而不是文件? 也许我应该使用不同于execlp()函数?

在我回答你的问题之前,有些担忧。

MD5很长,很久很久以后就已经破碎了。 创建具有给定MD5总和的文件是相当简单的。 SHA1正在走出困境。 使用SHA-256或更好。 如果您的申请与安全性无关,您和我没有资格做出有关攻击面的决定,请不要冒风险。

你考虑过在C中做校验和吗? 它将更快,更便携,更可靠。 任意数量的校验和库 Gnome Lib 提供校验和等等。

#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之后立即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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM