- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个简单的测试程序来尝试用 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
因为你的程序名称是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/
假设我 putenv 一个环境变量 ABC,然后执行 execl,或者我执行 execle 并将 ABC 添加到 envp 数组中我传递给 execle 的指针。 如果有的话,有区别吗? 最佳答案 p
我试图在 C++ 中运行 execl(),但它失败了,我不确定原因。 string fileName = "test.txt"; string computerName = "jssoile@
POSIX 系统公开了一系列 exec 函数,这些函数允许将可能不同的东西加载到当前进程中,保持打开的文件描述符、进程标识符等。 这可以出于多种原因完成,在我的例子中,这是自举——我想更改我自己进程的
我正在使用 c 中的 find 命令进行编程,但当我想对文件使用 exec 时,我被阻止了。 如果它是一个目录,那么很简单,我只使用 chdir(path) 但在文件上我有错误不是目录,所以我不能在上
if (fork_return==0) { printf("FROM THE CHILD PROCESS \n"); //print process id printf("The chil
我真的很喜欢这方面的一些调试帮助。我从早上到凌晨 4 点就一直在做这件事。 (我预计会在 7 小时内交付此内容 [上午 11 点]) main.c 中的所有内容都有效,但是当我创建一些子进程来使用 e
我试图理解这个系统调用(execle()),但我不知道它是如何工作的。我不知道如何使用 char* envp[],我们必须将其作为参数传递。我已经尝试过,但它不起作用: #include #incl
我有一个程序可以读取文件,对其进行处理并将结果放入输出文件中。当我有一个参数(输入文件)时,我创建输出文件并写入内容。 我创建了一个 fork() 以便将 stdout 重定向为 write() 内容
#include #include #include #define MAXLINE 512 main(int argc,char* argv[]){ int k; for (k
程序从配置文件中读取一些值,有些已定义,有些未定义,有些值为 0,有些处于事件状态。 我有以下代码: char *arg1="", *arg1_value="", *arg2="", *arg
你能帮我解决这个问题吗?execl 调用的程序“exam”和“students”执行了多少次?我认为正确的答案是程序“考试”有 8 个运行时间,“学生”有 0 个运行时间,因为在前两个 fork 中将
我正在制作一个 C 程序,该程序使用 execl 来执行 ls 命令来列出文件。如果在没有任何命令行参数的情况下调用程序,则会列出当前目录,如果用户将文件目录指定为命令行参数,则会列出该目录。 exe
我使用 TCC 编译并运行了以下程序在 Windows 7 下出现应用程序崩溃: #include int main(void) { if (execlp("c:\\windows\\sys
我正在使用 cywin 在 Windows 上编译 crashme 源代码,我遇到了一些编译错误。 错误: crashme.c: In function 'vfork_main': crashme.c
在UNIX环境下的系统编程上下文中,在使用C++编程语言时,在我的理解中,execl()会传入它要运行的程序的路径,以及一个vector。当传入该 vector 时,我将其理解为传入入口点,通常是 m
我有以下两个简单的程序: bye.cc #include int main() { std::cout #include #include #include using namespace
这个 execl 语句可能有什么问题?当我尝试运行它时,接收可执行文件提示 argc 小于 3。当我打印 argv 内容时,我得到以下信息: argv[1] = -1076146944 argv[2]
我的目标是学习如何执行 execle() 函数。我在 Head First C 书中找到了这段代码。 这是主进程代码(diner_info.c): #include #include int ma
在一个项目上工作,当我调用 execl() 时它不工作。它在 fork 之后调用,应该重新执行当前文件。(参数在文件的前面声明): argument = argv[0]; int err =execl
我正在尝试用 C 语言重现此命令: ls | wc > output.txt 因此,为此,我编写了以下程序: #include #include #include #include #incl
我是一名优秀的程序员,十分优秀!