首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用echo和md5sum执行

用echo和md5sum执行
EN

Stack Overflow用户
提问于 2016-10-15 00:27:37
回答 1查看 1.4K关注 0票数 1

我试图用execlp()编写一个程序,将字符串的md5sum输出保存到标准输出。基本上,为了模拟这一点:

代码语言:javascript
复制
echo "Hello!" | md5sum

它将获得以下输出:

代码语言:javascript
复制
31ebdfce8b77ac49d7f5506dd1495830  -

以下是我首先试图找出的问题:

代码语言:javascript
复制
char string[] = "Hello!";
execlp("md5sum", "md5sum", string, NULL); 

尽管以这种方式使用execlp()需要参数是一个文件,而不是字符串。所以我试了一下:

代码语言:javascript
复制
char string[] = "Hello!";
execlp("echo", "echo", string, "md5sum", NULL);

不过,这会生成Hello! md5sum的输出。它将"md5sum"识别为字符串,而不是系统调用。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-15 00:59:14

在我回答你的问题之前,我要谈谈一些问题。

MD5是很长很长很久很久没有断了。使用给定的MD5和创建一个文件非常简单。SHA1就快出来了。使用沙-256或更好。如果您的应用程序与安全性无关,您和我没有资格就攻击表面做出决定,不要冒险。

你考虑过用C来做校验和吗?它将更快,更便携,更可靠。这是任意数目的校验和库。Gnome Lib 提供校验和,还有更多。

代码语言:javascript
复制
#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的任何错误检查都会在执行程序之后立即进行;如果它成功,则调用程序将立即退出。

然后问题是,除非您正在更改正在运行的程序的名称,否则execlp可能会过度使用。使用execvp。我更喜欢它,因为它将程序的所有参数放在一个很好的列表中,可以用于稍后的错误检查。

代码语言:javascript
复制
#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));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40053762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档