unistd 的 execl() 不传递任何参数
unistd's execl() without passing any arguments
在我的代码中,我需要执行 /bin/bash
,但我不想在不向它传递任何参数的情况下执行它。我写了这个:
execl("/bin/bash", NULL);
然后,通过一些研究,我意识到我还需要添加类型转换:
execl("bin/bash", (char*) NULL);
但是 GCC 仍然给我警告:
main.c:18:5: warning: null argument where non-null required (argument 2) [-Wnonnull]
if(execl("/bin/bash", (char*) NULL) == -1) {
^
main.c:18:5: warning: not enough variable arguments to fit a sentinel [-Wformat=]
这样做的正确方法是什么,是我误解了什么,还是我使用了完全错误的函数调用?
您收到警告是因为惯例是第一个参数始终与 运行 中的程序路径相同,如下所示:
execl("/bin/bash", "/bin/bash", (char*) NULL);
这基本上就是当您 运行 在 shell 中没有参数的程序时发生的情况。
这个参数将进入执行程序的 argv[0]
,它可以用来检查它是如何 运行。
根据 man page,execl()
具有以下定义:
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
GCC 告诉您 execl()
函数需要一个非 NULL 参数。
execl()
的前两个参数应该是完整路径,然后是进程名。
至少我是这么理解的here:
刚遇到类似问题。我发现如果我指定了我的 exe 的完整路径(以 / 开头),则 execlp 和 execv 都不会传递任何参数。而且我无法向 stderr 输出任何内容。
因为我只想用它自己的克隆版本替换我当前的进程,我保存并使用父级的 argv[0] 作为 execlp/v 的 2 个第一个参数,一切都很好。
在我的代码中,我需要执行 /bin/bash
,但我不想在不向它传递任何参数的情况下执行它。我写了这个:
execl("/bin/bash", NULL);
然后,通过一些研究,我意识到我还需要添加类型转换:
execl("bin/bash", (char*) NULL);
但是 GCC 仍然给我警告:
main.c:18:5: warning: null argument where non-null required (argument 2) [-Wnonnull]
if(execl("/bin/bash", (char*) NULL) == -1) {
^
main.c:18:5: warning: not enough variable arguments to fit a sentinel [-Wformat=]
这样做的正确方法是什么,是我误解了什么,还是我使用了完全错误的函数调用?
您收到警告是因为惯例是第一个参数始终与 运行 中的程序路径相同,如下所示:
execl("/bin/bash", "/bin/bash", (char*) NULL);
这基本上就是当您 运行 在 shell 中没有参数的程序时发生的情况。
这个参数将进入执行程序的 argv[0]
,它可以用来检查它是如何 运行。
根据 man page,execl()
具有以下定义:
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
GCC 告诉您 execl()
函数需要一个非 NULL 参数。
execl()
的前两个参数应该是完整路径,然后是进程名。
至少我是这么理解的here:
刚遇到类似问题。我发现如果我指定了我的 exe 的完整路径(以 / 开头),则 execlp 和 execv 都不会传递任何参数。而且我无法向 stderr 输出任何内容。
因为我只想用它自己的克隆版本替换我当前的进程,我保存并使用父级的 argv[0] 作为 execlp/v 的 2 个第一个参数,一切都很好。