我写了一个使用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} }}。)?
答案 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 -Uusername
与ps -U username
相同。只需在控制台中键入它,它就会证明你的事实;)
行execlp("/bin/ps", "/bin/ps", "-U username", NULL);
不起作用,因为它就像在shell中键入ps '-U username'
一样。 '-U username'
是单个参数,不是ps