【问题标题】:Handling `argv` in a C command line program在 C 命令行程序中处理“argv”
【发布时间】:2011-03-27 14:30:39
【问题描述】:

我已经读过argv 的第一个数组成员永远是程序名。

坚持这个有用吗?我正在学习,如果这是一个愚蠢的问题,请原谅我。

人们是否曾经因为第一个成员无用而取消移动第一个成员(并将 argv 重置为少一个?),还是将其留在那里是最佳实践,因为人们期望它会一直存在(并且它可以解决argc) 的框?

【问题讨论】:

标签: c command-line-arguments


【解决方案1】:

确切地说,argv[0] 是传递给 exec(2) 的任何内容,通常是程序名称,但可以是任何内容。

不要取消它,因为太多隐藏的依赖依赖它。

【讨论】:

  • 隐藏依赖?没有功能exec。有execve(2),但它及其家族需要新文件名作为参数。你为什么要execl当前的可执行文件?这只会重新初始化所有内容。
【解决方案2】:

我已经读过 argv 的第一个数组成员永远是程序名。

应该是。 C 和 C++ 都要求如果argc 大于零,则argv[0] 应为程序名称或空字符串。

某些系统不一定在所有情况下都遵循此约定(例如,在 Windows 上,您可以使用 CreateProcess 创建新进程,而不是在用于填充 @987654324 的命令行参数中传递程序名称@ 和 argv)。

坚持这个有用吗?

当然。例如,如果您想生成另一个您自己的实例,或者如果您想打印您的程序名称(例如在使用说明中)。

人们是否曾经因为第一个成员无用而取消移位,或者将其留在那里是最佳实践?

不要更改实际参数;下一个出现的人可能会期待他们保持原来的样子。

【讨论】:

  • Unix exec() 系列系统调用还允许独立于要退出的文件指定 argv[0]。例如,登录 shell 通常有一个前导 - 由登录过程使用此功能附加到其名称。
【解决方案3】:

预计 argv[0] 将始终包含可执行文件的名称。因此,您永远不应删除它。

至于它是否有用,argv[0] 的一个用途是如果您希望您的应用程序根据调用方式来改变行为。

Busybox,例如,在嵌入式 linux 系统上使用它。通常,您将拥有可执行文件的单个副本并创建指向具有不同名称的可执行文件的符号链接。例如。 cp、rm、ls等 Busybox 然后根据 argv[0] 的内容确定执行哪个函数。

【讨论】:

  • 听起来很有趣,但是,这是标准的做法还是仅限于 Busybox 应用程序?
  • 这是一种非常标准的技术。也用于 ccache 和 distcc 等应用程序。
  • IIRC,许多核心“双字母”实用程序在 System III 和早期 BSD 版本上的实现方式相同。 (我承认自己使用过 System III 是不是暴露了我的年龄?)
  • 我不认为这是一个好的一般论点。这些都是类似于 shell 的应用程序(或者,在 Sys III 中,实际的 shell)。在开始一个项目之前,您就知道它是否会模拟其他程序的命令行行为。
  • Vim 做同样的事情 (vim, view, ex)。
【解决方案4】:

第一个参数并不总是程序名称 - 它取决于它的调用方式(请参阅here)。

argv[0] 通常用于帮助文本:

fprintf(stderr, "Usage: %s <foo> [bar]\n", argv[0]);

移动数组并不是非常有用或高效。您不妨从索引 1 开始使用 argv。

【讨论】:

  • ++ argv; -- argc; 有效地移动数组。我认为这就是 OP 的意思。
【解决方案5】:

argv[0] 的内容不是 ANSI 定义的。 argv 可以枚举:

main(int argc,char**argv)
{
  while( argc-- )
    puts(*argv++);
  return 0;
}

【讨论】:

    【解决方案6】:

    来自 ISO C99,§5.1.2.2.1,

    如果argc的值大于零,则argv[0]指向的字符串代表程序名;如果主机环境中没有程序名称,则 argv[0][0] 应为空字符。

    因此,在符合要求的实现中,您可以依赖 argv[0] 作为程序的名称​​如果您之前测试它是否存在(也就是说,如果您可以断言 argc &gt; 0)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-08
      • 2014-06-02
      • 2013-01-22
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多