【发布时间】:2015-12-21 16:45:50
【问题描述】:
在我的代码中,我需要执行/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=]
这样做的正确方法是什么,是我误解了什么,还是我使用了完全错误的函数调用?
【问题讨论】:
-
到目前为止,您已经得到了几个基本相同的答案。我会注意到获取登录 shell 的经典方法是
execl("/bin/sh", "-sh", (char *)0),其中-表示它是登录 shell。 Bash(和其他一些 shell)已经对其进行了规范化,以便execl("/bin/bash", "bash", "-l", (char *)0)是一个登录 shell。