unistd的execl()没有传递任何参数?

时间:2015-12-21 16:45:51

标签: c linux unistd.h

在我的代码中,我需要执行/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=]

这样做的正确方法是什么,我不理解某事,或者我是否使用完全错误的函数调用?

4 个答案:

答案 0 :(得分:6)

您收到警告,因为约定是第一个参数始终与正在运行的程序的路径相同,如下所示:

execl("/bin/bash", "/bin/bash", (char*) NULL);

这实质上是在shell中运行没有参数的程序时发生的事情。

此参数将进入已执行程序的argv[0],它可以用来检查它的运行方式。

答案 1 :(得分:3)

根据man pageexecl()具有以下定义:

   int execl(const char *path, const char *arg, ...
                   /* (char  *) NULL */);

GCC告诉你execl()函数期望非NULL参数。

答案 2 :(得分:1)

刚遇到类似的问题。我发现如果我指定了我的exe的完整路径(以/开头),execlp和execv都没有传递任何参数。而且我无法向stderr输出任何内容。

因为我只想用我自己的克隆版本替换当前进程,所以保存并使用父进程的argv [0]作为execlp / v的2个第一个参数,一切都很好。

答案 3 :(得分:-1)

Message的前两个参数应该是完整路径,然后是进程名称。

至少我是如何解释的here: