5

与 Linux 等效的 GetCommandLine 和 CommandLineToArgv 类似的问题

是否可以在 linux中获取原始命令行?文件 /proc/self/cmdline 被破坏。

./a.out files="file 1","file 2" param="2"

印刷

./a.outfiles=file 1,file 2param=2

这是垃圾

转义命令行确实适用于除第一个参数之外的所有参数。

./a.out files=\"fil 1\",\"fil 2\"\ param=\"2\"

印刷

./a.outfiles="fil1","fil2" param="2"
4

1 回答 1

11

你不能那样做。命令行参数实际上作为单独的字符串传递给新进程。查看linux内核源码: kernel_execve

请注意,它kernel_execve(...)需要一个const char *argv[]- 因此在 Linux 中没有长字符串命令行之类的东西 - 它是上面的层,需要将参数拆分为单独的组件。

编辑:实际上,系统调用在这里:

excve 系统调用

但上面的说法仍然适用。argv 的参数在内核从 C 库调用 exec 中获取它时已经被拆分。

生成 argv[] 数组是“程序的启动者”(通常是 shell,但不一定是)的责任。它将执行“通配符”(将通配符文件名扩展为它匹配的实际文件)并去除引号、变量替换等。

我还要指出,尽管 C 库中有多种“exec”变体,但进入内核的方式只有一种。所有变体最终都出现在execve我上面链接的系统调用中。其他变体仅仅是因为调用者可能不喜欢将参数拆分为单个元素,因此 C 库通过为程序员这样做来“帮助”。类似地,将环境数组传递给新程序 - 如果程序员不需要特定环境,他/她可以调用自动获取父进程 env 的变体。

于 2012-12-26T15:38:31.980 回答