为什么execl(...)会在find-utils的find程序中输出什么?

时间:2017-12-26 14:32:02

标签: c++ linux find exec

我编写了一个简单的测试程序,尝试使用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版本编译了它。

2 个答案:

答案 0 :(得分:0)

发布的代码无法使用C编译器进行编译。

建议使用以下代码:

#include <unistd.h>   // execl(), _exit()
#include <stdio.h>    // perror()

int main( void )
{
    execl("/usr/bin/find", "/usr/bin/find", "/", "-maxdepth", "1", "-name", "bin", NULL);
    perror("In QueryRequest::Client_Execute(): ");
    _exit(1);
}

答案 1 :(得分:0)

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

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

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

顺便说一句,使用test作为您的程序名称​​不良品味,因为与标准test(1)冲突(例如bash test builtin)....所以我强烈建议使用其他名称,例如mytest ....

当然,请仔细阅读find(1)的文档。

BTW,在我的Debian系统上,您的程序(重命名为curious)正常工作并输出/bin

请注意,您可以使用nftw(3)避免在C程序中运行find进程。

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