我如何知道哪个exec命令用于特定程序?

时间:2014-04-22 06:18:36

标签: c linux bash exec

我的问题是关于C系统调用的exec系列。我如何预测正在执行的程序正在寻找什么类型的输入,因为exec系列在字符串列表arg1,arg2,arg3 ...和参数的2d char数组之间变化。大多数Linux命令行程序都可以处理这两种形式的输入吗?

例如:

int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);

如果我执行ls会发生什么:

execl('/bin/ls', 'ls', NULL);

execv('/bin/ls', lsArgsArray);

据推测,ls可以处理两种形式的输入,但我真正的问题是关于其他实用程序的一般性问题,可以安全地假设你可以调用它们吗?如果使用任何一种方法调用都不安全,那么bash会如何区分使用哪种方法?

1 个答案:

答案 0 :(得分:6)

执行的程序和内核都没有看到您调用的任何差异:它们都被C库转换为相同的系统调用。执行的程序在内核后面又增加了一步,因此看到任何差异的机会就更少了。

对于确切的内核接口,请查看内核或平台C库的源代码。

shell(bash / ash / csh / sh / ...)没有任何特权。不过,直接进入API调用允许您传递虚假程序名称。