与Linux等效的GetCommandLine和CommandLineToArgv类似的问题
是否可以在linux中获取原始命令行?文件/ proc / self / cmdline是destroyd.
./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"
解决方法:
你不能这样做.命令行参数实际上作为单独的字符串传递给新进程.查看linux内核源代码:
kernel_execve
请注意,kernel_execve(…)采用const char * argv [] – 因此Linux中没有长字符串命令行 – 上面的层需要将参数拆分为单独的组件.
编辑:实际上,系统调用在这里:
但上述声明仍然适用. argv的参数已经在内核从C库调用到exec的时候被拆分.
“程序的启动程序”(通常是shell,但不一定是)负责生成argv []数组.它将执行“globbing”(将通配符文件名扩展到它匹配的实际文件)和剥离引用,变量替换等等.
我还要指出,虽然C库中有“exec”的几种变体,但只有一种方法可以进入内核.所有变体最终都在我上面链接的execve系统调用中.其他变体仅仅是因为调用者可能不喜欢将参数拆分成单独的元素,因此C库通过为程序员执行此操作来“帮助”.类似地,为了将环境数组传递给新程序 – 如果程序员不需要特定的环境,他/她可以调用自动获取父进程env的变体.