呼叫" ps"带有execl参数的命令具有意外行为

时间:2016-04-20 10:02:45

标签: c bash execl

我写了一个使用execl函数的简单C程序。我在运行此程序后期望看到的是ps -U myusername的输出。

如果在终端中写ps -U myusername,我会得到所需的结果。

如果调用execl("/bin/ps", "/bin/ps", "-U myusername", NULL),我会收到以下错误消息error: improper list

但是,如果我从-U myusername中移除空格,并按以下方式调用该函数:execl("/bin/ps", "/bin/ps", "-Umyusername", NULL),我会得到正确的结果。

为什么会发生这种情况?如何实现预期的行为(这只是一个简单的例子;我真正想要的是让用户输入命令并将其拆分为命令和参数,最后调用{{1} }}。)?

1 个答案:

答案 0 :(得分:2)

它是一种可变函数。只需将其称为:

execlp("command", "command", "first arg", "second arg" /*, etc*/, NULL);

或在你的情况下

execlp("/bin/ps", "/bin/ps", "-U", "username", NULL);

NULL对函数说:"没关系,没有更多的参数。"如果你忘了它,就会有一个未定义的行为。

更进一步:http://manpagesfr.free.fr/man/man3/stdarg.3.html

execlp("/bin/ps", "/bin/ps", "-Uusername", NULL);有效,因为ps -Uusernameps -U username相同。只需在控制台中键入它,它就会证明你的事实;)

execlp("/bin/ps", "/bin/ps", "-U username", NULL);不起作用,因为它就像在shell中键入ps '-U username'一样。 '-U username'是单个参数,不是ps

的有效参数