我试图用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()不同的函数?
发布于 2016-10-15 00:59:14
在我回答你的问题之前,我要谈谈一些问题。
MD5是很长很长很久很久没有断了。使用给定的MD5和创建一个文件非常简单。SHA1就快出来了。使用沙-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程序的工作方式。您可以让md5sum从stdin中读取,但这涉及管道,而且更多,我想继续。我说过要用图书馆吗?
这将导致第二个问题:错误检查。我什么都没看到。对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));
}https://stackoverflow.com/questions/40053762
复制相似问题