与 Linux 等效的类似问题 GetCommandLine 和 CommandLineToArgv
是否有可能获得rawLinux 下的命令行?文件 /proc/self/cmdline 被破坏。
./a.out files="file 1","file 2" param="2"
prints
./a.outfiles=file 1,file 2param=2
这是垃圾
转义命令行确实适用于除第一个参数之外的所有参数。
./a.out files=\"fil 1\",\"fil 2\"\ param=\"2\"
prints
./a.outfiles="fil1","fil2" param="2"
你不能那样做。命令行参数实际上作为单独的字符串传递给新进程。查看linux内核源码:内核执行
注意kernel_execve(...)
需要一个const char *argv[]
- 所以 Linux 中不存在长字符串命令行这样的东西 - 上面的层需要将参数分割成单独的组件。
编辑:实际上,系统调用在这里:
执行系统调用
但上面的说法仍然适用。当内核从对 exec 的 C 库调用中获取 argv 的参数时,该参数已经被分割。
“程序的启动者”(通常是 shell,但不是必须的)负责生成 argv[] 数组。它将执行“通配符”(将通配符文件名扩展为它匹配的实际文件)和删除引号、变量替换等。
我还要指出,尽管 C 库中存在“exec”的多种变体,但进入内核的方式只有一种。所有变体最终都在execve
我上面链接的系统调用。其他变体只是因为调用者可能不喜欢将参数拆分为单独的元素,因此 C 库通过为程序员这样做来“帮助”。类似地,将环境数组传递给新程序 - 如果程序员不需要特定环境,他/她可以调用自动采用父进程环境的变体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)