c – GetCommandLine linux * true *等效

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中没有长字符串命令行 – 上面的层需要将参数拆分为单独的组件.

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

excve system call

但上述声明仍然适用. argv的参数已经在内核从C库调用到exec的时候被拆分.

“程序的启动程序”(通常是shell,但不一定是)负责生成argv []数组.它将执行“globbing”(将通配符文件名扩展到它匹配的实际文件)和剥离引用,变量替换等等.

我还要指出,虽然C库中有“exec”的几种变体,但只有一种方法可以进入内核.所有变体最终都在我上面链接的execve系统调用中.其他变体仅仅是因为调用者可能不喜欢将参数拆分成单独的元素,因此C库通过为程序员执行此操作来“帮助”.类似地,为了将环境数组传递给新程序 – 如果程序员不需要特定的环境,他/她可以调用自动获取父进程env的变体.

上一篇:测试gcc的优化选项


下一篇:ActiveMQ producer不断发送消息,会导致broker内存耗尽吗?