我编写了一个简单的测试程序,尝试使用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版本编译了它。
答案 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
调用)的文档。
请注意,execl
和execve
仅在失败时返回。当它们成功时,它们不会返回(因为调用过程正在完全改变其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
。