【发布时间】:2017-02-24 12:16:34
【问题描述】:
我正在尝试使用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() 不同的功能?
【问题讨论】:
-
你需要 pipe、fork 和 execlp 来完成这项工作。
-
md5sum 不带字符串,它带文件。
-
md5sum显然可以从stdin读取。接受@JonathanLeffler 的建议 -
在 shell 中,
stdin的md5sum是stdout的echo。正如第一条评论所暗示的那样,您需要模仿它。 -
在 unix 编程中,fork 和执行一个进程,通过一个管道给它一个字符串并通过另一个管道收集输出,这是一个很酷的练习,每个 unix 程序员都应该编写一次代码,因为它会帮助您理解一些重要的概念。但是对于正常使用,使用库函数更快,通常更容易。 Wikipedia 可能会帮助您找到一个。 (对于加密,只使用信誉良好的库,并确保您进行单元测试;将您的输出与命令行实用程序进行比较也很好。