【问题标题】:Linux equivalent of GetCommandLine and CommandLineToArgv?Linux 等效于 GetCommandLine 和 CommandLineToArgv?
【发布时间】:2010-01-05 01:38:08
【问题描述】:

我想知道Linux上是否有一些API可以获取当前进程的命令行参数。


我想我非常不清楚。这个问题的真正目的是通过命令行参数传递 unicode 文件名。

【问题讨论】:

  • int main(int argc, char *argv[]),您在argc 中有参数的数量,而argv 是包含参数的char 指针数组。这是 ANSI C,因此适用于任何可移植的实现。还是你想要命令行选项解析?
  • 我明白了。我知道 argc argv 范式。我想知道如何通过 argv 获取 unicode 参数。
  • argv 会给你任何放在里面的shell;因为 shell 只是将其视为一个字节字符串,因此会将其推回终端。现在所有常见的终端都支持 unicode,所以它应该可以工作。

标签: c linux api


【解决方案1】:

从文件/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

【讨论】:

  • 注意分隔每个标记的空字节 (0x00)。此外,/proc/self/cmdline 中的文本与用户输入的内容不完全相同——引号将被删除,等等。
  • 还要注意,目前/proc界面只显示命令行的第一页(4k),即使它可能更长(我相信最多32页)。
【解决方案2】:

checkout Getopt 这是一个命令行解析库,用包括 C 在内的多种语言实现。

否则:

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

argv 是一个参数数组,char*argc 是参数的数量。

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

【讨论】:

    【解决方案3】:

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

    可能会发生不好的事情,例如用户可以编写一个文件然后更改他们的语言环境,而将他们的文件名编码在以前的语言环境中。因此,如果您将文件名作为输入,则需要保留在 main() 中传递给您的确切 8 位字节序列。如果您需要向用户显示它,请尝试以当前语言环境的编码对其进行解释,并转换为您喜欢的 Unicode 类型。

    在许多现代 Linux 系统上,编码为 UTF-8,因此通常可以正常工作。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 2014-05-14
        • 1970-01-01
        • 2012-08-09
        • 2012-08-29
        相关资源
        最近更新 更多