在我的代码中,我需要执行/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]
,它可以用来检查它是如何运行的.