GetCommandLine linux *true* equivalent

GetCommandLine linux *true* equivalent

本文关键字:equivalent true GetCommandLine linux      更新时间:2023-10-16

类似于Linux中的GetCommandLine和CommandLineToArgv

是否有可能在linux中获得raw命令行?文件/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"

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

注意,kernel_execve(...)接受一个const char *argv[]——所以在Linux中没有长字符串命令行这样的东西——是上面的层需要将参数拆分为单独的组件。

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

但是上面的语句仍然适用。argv的参数在内核从c库调用exec获得它时已经被分割了。

生成argv[]数组是"程序启动器"(通常是shell,但不一定是)的责任。它将执行"globbing"(将通配符文件名扩展到它匹配的实际文件)和去掉引号,变量替换等等。

我还要指出,尽管在C库中有几种"exec"的变体,但只有一种方法可以进入内核。所有的变体最终在execve系统调用,我链接到上面。其他变体只是因为调用者可能不喜欢将参数拆分为单独的元素,所以C库通过为程序员做这件事来"帮助"。类似地,将环境数组传递给新程序—如果程序员不需要特定的环境,他/她可以调用自动接受父进程env的变量。