我编写了一个简单的测试程序,尝试使用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
调用)的文档。
请注意,execl
和execve
仅在失败时返回。当它们成功时,它们不会返回(因为调用过程完全改变了它的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 -g
为GCC。学习use the debugger gdb
。
使用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);
}