如何使用标准输入'<'在execl?

时间:2017-08-05 18:00:05

标签: c++ c linux

我希望达到相当于&#34; ./myfile < input.txt&#34;使用execl()

execl("path/myfile", ",myfile", "< input.txt");

execl("/home/user/Desktop/Fuzzer/clear/easy_fuzzer/buf", "/home/user/Desktop/Fuzzer/clear/easy_fuzzer/buf", "buf < input", NULL);

execlp("/home/user/Desktop/Fuzzer/clear/easy_fuzzer/buf", "/home/user/Desktop/Fuzzer/clear/easy_fuzzer/buf", "input");

但命令失败......

我想要&#39; input.txt&#39;和&#39;&lt;&#39;使用execl通过myfile命令 - 我该怎么做?

1 个答案:

答案 0 :(得分:0)

在运行execl()代码之前,您的代码必须执行I / O重定向。 如果你想实现shell运行的效果:

/user/Desktop/Fuzzer/clear/easy_fuzzer/buf < input

然后你需要在子代码中写这样的东西:

const char *filename = "input";  // or "input.txt" — the question uses both
int fd = open(file, O_RDONLY);
if (fd < 0)
    err_syserr("failed to open file %s for reading\n", filename);
if (dup2(fd, STDIN_FILENO) < 0)
    err_syserr("failed to redirect %s to standard input\n", filename);
close(fd);  // In theory, it could fail, but there isn't much you can do about it

const char *cmdpath = "/home/user/Desktop/Fuzzer/clear/easy_fuzzer/buf";
execl(cmdpath, "buf", (char *)NULL);
err_syserr("failed to execute program %s\n", cmdpath);

这通常都应该在孩子执行的代码中。

您可以在err_syserr()stderr.c stderr.h中找到exec*()功能的代码。一行错误处理比写出多行更简单。请注意,没有理由检查任何execl()函数的返回值。如果函数返回,则失败。如果成功,则会运行不同的流程来代替当前流程。

如果您喜欢以冗长的方式做事,您可以调查您的系统是否支持https://github.com/jleffler/soq/tree/master/src/libsoq及其同事。您可以通过设置适当的属性序列来执行各种操作。对于我的钱,编写如上所示的代码要简单得多。

我可能不会使用execv() - 我可能会使用execvp()(或者buf),因为它允许在运行时修改参数列表而不是强制它在编译时修复。代码将argv[0]作为argv[0]的值传递给执行的程序。如果您希望完整路径名称为execlp(),则可以执行此操作。

请注意,如果execvp()(或exec*()或任何其他路径搜索/函数)的第一个参数的文件名部分包含任何{{1}} ,然后没有执行基于路径的搜索,因此如果命令名称是绝对路径名,则不适合使用它们,如示例所示。