使用 execl 调用带有参数的 "ps"命令会出现意外行为

标签 c bash execl

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

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

如果调用execl("/bin/ps", "/bin/ps", "-U myusername", NULL),我收到以下错误消息错误:不正确的列表.

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

为什么会发生这种情况以及如何实现预期的行为(这只是一个简单的示例;我真正想要的是让用户输入命令并将其拆分为命令和参数,最后调用类似 execlp("命令", "命令", "参数", 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 用户名相同。只需在控制台中输入它,它就会向您证明这一事实;)

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

的有效参数

关于使用 execl 调用带有参数的 "ps"命令会出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36740348/

相关文章:

c - 为什么它显示两个数组而不是一个数组

bash - 文件存在时运行 GNU Parallel

linux - 执行两个字节

bash/sed,以相同的缩进级别替换文件中的行

linux - 仅在 Linux 上通过命令行将 xlsx 转换为文本 CSV

linux - Linux中execl如何处理 "/bin/sh"?

c - 为什么 execl 会覆盖文件

c - 为什么不能从 Windows 消息队列中打印

c - 如何修复将 'char [16]' 传递给类型为 'FILE *'(又名 'struct __sFILE *')的参数的不兼容指针类型 [-Wincompatible-pointer-types]

c - 为什么 _itoa 导致我的程序崩溃?