首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在execl中使用标准输入“<”?

如何在execl中使用标准输入“<”?
EN

Stack Overflow用户
提问于 2017-08-05 18:00:05
回答 1查看 752关注 0票数 0

我想使用./myfile < input.txt实现与“execl()”同等的功能

代码语言:javascript
复制
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");

但命令失败了..。

我希望'input.txt‘和'<’命令通过我的文件使用execl -我怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-05 20:39:48

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

代码语言:javascript
复制
/user/Desktop/Fuzzer/clear/easy_fuzzer/buf < input

然后,您需要在子代码中编写类似的内容:

代码语言:javascript
复制
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.cstderr.h中的代码。一行错误处理使它比写出多行少一些。请注意,没有理由检查任何exec*()函数的返回值。如果函数返回,则失败。如果成功,将有一个不同的进程正在运行,而不是当前进程。

如果您喜欢长篇大论地做事,您可以调查您的系统是否支持posix_spawn()及其同事。您可以通过设置适当的属性序列来完成各种事情。就我的钱而言,编写代码要简单得多,而且更清晰,如上所示。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45524933

复制
相关文章

相似问题

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