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

问题描述 投票:0回答:2

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

c++ linux find exec
2个回答
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)的文档。

顺便说一句,在我的Debian系统上你的程序(更名为curious)工作并输出/bin

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

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


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.