【发布时间】:2016-02-09 11:50:40
【问题描述】:
我想编写一个执行 Linux ls 命令的程序。
我真的只想输入ls 而不是/bin/ls,所以我想用execve 来做这个(execvp 不是一个选项)。
我试过了:
char *env[] = { "SHELL=/bin/bash",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games",
"_=/usr/bin/env",
(char *)0 };
execve(parmList[0], parmList, env);
但它似乎不起作用,ls 未被识别,但 /bin/ls 被识别。 parmList 没有任何问题,因为我用 execvp 尝试过这个,它成功了。
有什么想法吗?
【问题讨论】:
-
1) 为什么
execvp不是一个选项? 2)你查过execvp/execvpe和execv/execve之间的区别吗? -
请给出完整的数据。
parmList是如何声明/填充的?结果是什么(perror,返回值……)? -
1) 因为我希望有一天可以说:我使用程序“abc”,例如“/home/user/programs”每天,我不想每次都输入完整路径。然后应该可以简单地添加另一个数组条目。 2) execvpe 似乎可以工作,但我的编译器出于任何原因不喜欢它。
-
编译器在哪些方面不喜欢它?它是否抱怨它没有被宣布?如果该功能有效,则可能意味着链接器找到了它。您可能需要指定
-std=gnu11而不是-std=c11,或者您可能需要使用#define _GNU_SOURCE才能使execvpe()的声明可见。
标签: c linux environment-variables execve