我编写了一个使用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)
,我会得到正确的结果。
为什么会发生这种情况,我如何实现预期的行为(这只是一个简单的例子;我真正想要的是让用户输入命令,并将其拆分为命令和参数,最后调用类似execlp("command", "command", "arguments", NULL)
的东西。)?
它是一个变差函数。就这样称呼它吧:
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
的有效自变量