Linux与GetCommandLine和CommandLineToArgv的等价物?
我想知道是否有一些API可以在Linux上获取当前进程的命令行参数Linux与GetCommandLine和CommandLineToArgv的等价物?,c,linux,api,C,Linux,Api,我想知道是否有一些API可以在Linux上获取当前进程的命令行参数 我想我当时非常不清楚。这个问题的真正目的是通过命令行参数传递unicode文件名。checkout这是一个命令行解析库,用包括C在内的多种语言实现 否则: int main(int argc, char *argv[]) argv是一个参数数组,如char*和argc是参数数 argv[0]始终是可执行文件名本身 从文件读取/proc/self/cmdline 例如: [wallyk@zf ~]$ od -a /proc/3
我想我当时非常不清楚。这个问题的真正目的是通过命令行参数传递unicode文件名。checkout这是一个命令行解析库,用包括C在内的多种语言实现 否则:
int main(int argc, char *argv[])
argv
是一个参数数组,如char*
和argc
是参数数
argv[0]
始终是可执行文件名本身 从文件读取/proc/self/cmdline
例如:
[wallyk@zf ~]$ od -a /proc/30651/cmdline
0000000 / u s r / s b i n / h t t p d nul
0000020
或者,对于令人满意的自我介绍:
[wally@zf images]$ od -c /proc/self/cmdline
0000000 o d \0 - c \0 / p r o c / s e l f
0000020 / c m d l i n e \0
0000031
只需使用
argc
和argv
argv
将采用本地编码(可能是UTF-8),从那里您可以转换为wchar\u t
(例如,通过mbtowc
)。Linux本身不做“Unicode文件名”。就内核而言,所有文件名都只是8位字符的随机序列
不好的事情可能会发生,比如用户可以编写一个文件,然后更改其区域设置,将其文件名保留在以前的区域设置中。因此,如果将文件名作为输入,则需要保留在main()中传递给您的精确8位字节序列。如果需要将其显示给用户,请尝试用当前语言环境的编码对其进行解释,并将其转换为您最喜欢的Unicode类型
在许多现代Linux系统上,编码将是UTF-8,因此这通常可以正常工作。
intmain(intargc,char*argv[])
,在argc
中有参数的数量,argv
是包含参数的char
指针数组。这是ANSIC,因此将适用于任何可移植的实现。还是要命令行选项解析?我明白了。我知道argc-argv范式。我想知道如何通过argv获得unicode参数。argv将提供shell放在其中的任何内容;由于shell只将其视为字节字符串,因此会将其推回到终端。现在所有的通用终端都支持unicode,所以它应该可以正常工作。注意每个令牌之间的空字节(0x00)分隔。此外,/proc/self/cmdline中的文本将与用户键入的内容不完全相同——引号将被删除,等等。还请注意,当前的/proc
界面仅显示命令行的第一页(4k),即使它可能更长(我相信最多32页)。