gpt4 book ai didi

c++ - 为什么 find-utils 中的 find 程序上的 execl(...) 不会输出任何内容?

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:54 26 4
gpt4 key购买 nike

我写了一个简单的测试程序来尝试用 find 命令的路径调用 execl(...) 作为测试。无论发送到查找程序的参数如何,stdout 上都没有输出。为什么会这样?这是程序:

#include <unistd.h>
#include <sys/types.h>
#include <cstdio>
#include <cerrno>


int main(int argc, char** argv)
{
if(execl("/usr/bin/find", "/usr/bin/find", "/", "-maxdepth", "1", "-name", "bin", (char*)NULL) == -1)
{
perror("In QueryRequest::Client_Execute(): ");
_exit(1);
}

return 0;
}

以上是程序的编译运行测试;请注意,它没有输出。使用上述参数从控制台执行 find 会产生非空输出。这里有什么问题,我该如何解决?

[main@main-pc src]$ g++ test.cpp -o test
[main@main-pc src]$ ./test
[main@main-pc src]$

关于目标系统的具体元信息:

Linux 4.9.66-1-MANJARO #1 SMP PREEMPT Thu Nov 30 14:08:24 UTC 2017

使用 -print 参数查找不会改变结果。该行为在其他系统上符合预期,包括 4.9.66-1-MANJARO 和另一个使用 4.11 内核的基于 ARCH 的专有发行版。我用 g++ 7.2 和其他 4.x 版本编译了它。

最佳答案

仔细阅读 execl(3) 的文档和 execve(2)系统调用(由 execl 调用)。

注意 execlexecve仅在失败时返回。当它们成功时,它们不会返回(因为调用进程正在完全更改其 virtual address space 以运行新的 executable)。

要调试您的问题,您可以暂时替换 /usr/bin/find通过 /bin/echo ,和/或也可能使用 strace(1) ,例如strace ./test .

顺便说一句,使用 test因为你的程序名称是poor taste,因为与标准冲突test(1) (例如 bash test builtin )....所以我强烈建议使用另一个名称,例如mytest ....

当然,也要仔细阅读find(1)的文档.

顺便说一句,在我的 Debian 系统上,您的程序(重命名为 curious )运行并输出 /bin

请注意,您可以避免运行 find使用 nftw(3) 从您的 C 程序处理.

此外,请记住 C 和 C++ 是不同的语言(您的代码看起来像 C,但您应该使用 #include <stdio.h>#include <errno.h> )。不要忘记使用所有警告和调试信息进行编译,所以 with -Wall -Wextra -g对于 GCC .学习use the debugger gdb .

关于c++ - 为什么 find-utils 中的 find 程序上的 execl(...) 不会输出任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com