2010-01-05 52 views
7

我不知道是否有一些API可以在Linux上获得当前进程的命令行参数。我想我很不清楚。问题的真正目的是通过命令行参数传递unicode文件名。相当于Linux的GetCommandLine和CommandLineToArgv?

+1

'int main(int argc,char * argv [])',你有'argc'参数的个数,'argv'是一个包含参数的'char'指针数组。这是ANSI C,所以可用于任何便携式实现。或者你想要命令行选项解析? – 2010-01-05 01:45:17

+0

我明白了。我意识到argc argv范式。我想知道如何通过argv获得unicode参数。 – lyxera 2010-01-05 01:53:49

+2

argv会给你任何壳放在那里;因为shell将它视为一个字节字符串,将其推回到终端。现在所有的通用终端都支持unicode,所以它应该可以正常工作。 – 2010-01-05 01:58:56

回答

9

从文件/proc/self/cmdline

阅读例如:

[[email protected] ~]$ od -a /proc/30651/cmdline 
0000000 / u s r / s b i n / h t t p d nul 
0000020 

或者,一个令人满意的清爽自我参照:

[[email protected] 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 
+1

小心定义每个标记的空字节(0x00)。此外,/ proc/self/cmdline中的文本不会完全是用户输入的内容 - 引号将被删除,等等。 – 2010-01-05 01:55:24

+0

还要小心,目前'/ proc'界面只显示第一页(4k)的命令行,尽管它可能会更长(我相信高达32页)。 – Jester 2015-06-04 11:50:32

3

结帐Getopt这是这是一个在许多语言,包括C.

否则实现的命令行解析库:

int main(int argc, char *argv[]) 

argv是参数如char*argc阵列是参数的数目。

argv[0]始终是可执行文件名本身。

+0

你的意思是Getopt? – fennec 2010-01-05 01:40:24

+0

啊是的,谢谢fennec – 2010-01-05 01:47:50

1

只需使用argcargvargv将采用本地编码(可以是UTF-8),然后从那里转换为wchar_t(例如,通过mbtowc)。

1

Linux本身不会执行“Unicode文件名”。就内核而言,所有文件名只是8位字符的随机序列。

糟糕的事情可能发生,就像用户可以编写文件然后更改它们的区域设置,并保留它们的文件名在先前的区域设置中编码一样。所以如果你将一个文件名作为输入,你需要保留在main()中传递给你的确切的8位字节序列。如果您需要将其显示给用户,请尝试在当前语言环境的编码中对其进行解释并转换为您最喜欢的Unicode类型。

在许多现代Linux系统上,编码将是UTF-8,所以这通常工作正常。