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

use*_*079 0 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[]);
Run Code Online (Sandbox Code Playgroud)

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

execl('/bin/ls', 'ls', NULL);
Run Code Online (Sandbox Code Playgroud)

与:

execv('/bin/ls', lsArgsArray);
Run Code Online (Sandbox Code Playgroud)

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

Ded*_*tor 6

无论你调用什么程序,执行程序和内核都看不出任何差别:它们都被C库转换为相同的系统调用.执行的程序在内核之后又增加了一步,因此看到任何差异的机会更少.

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

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