我想使用./myfile < input.txt实现与“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");但命令失败了..。
我希望'input.txt‘和'<’命令通过我的文件使用execl -我怎么做呢?
发布于 2017-08-05 20:39:48
在运行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*()函数的返回值。如果函数返回,则失败。如果成功,将有一个不同的进程正在运行,而不是当前进程。
如果您喜欢长篇大论地做事,您可以调查您的系统是否支持posix_spawn()及其同事。您可以通过设置适当的属性序列来完成各种事情。就我的钱而言,编写代码要简单得多,而且更清晰,如上所示。
我可能不会使用execl() -我可能会使用execv() (或者execvp()),因为它允许在运行时修复参数列表,而不是强制在编译时修复它。代码将buf作为argv[0]的值传递给已执行的程序。如果您想要完整的路径名为argv[0],您可以这样做。
请注意,如果execlp() (或execvp(),或任何其他路径搜索exec*()函数)的第一个参数的文件名部分包含任何/,则不执行基于路径的搜索,因此如果命令名是绝对路径名称,则不适合使用它们。
https://stackoverflow.com/questions/45524933
复制相似问题