【问题标题】:What does initialize_main (&argc, &argv) do?initialize_main (&argc, &argv) 有什么作用?
【发布时间】:2013-10-09 15:48:05
【问题描述】:

我正在阅读coreutils源码学习linux下的编程。

我发现在 ls.c、cat.c 等大多数程序中,它们在前几行调用宏函数 initialize_main()。所以我查看了 system.h 以找到实现:

/* Redirection and wildcarding when done by the utility itself.
Generally a noop, but used in particular for native VMS. */
#ifndef initialize_main
# define initialize_main(ac, av)
#endif

我不明白为什么要定义这样的宏,我不明白评论。

【问题讨论】:

  • 如果您观察这些宏在文件中的使用位置和方式,您就会知道。
  • 评论很好地解释了它“通常是noop,但特别用于本机VMS。”。所以在linux下,这是一个nop,什么都没有。 VMS 可能对参数处理做了一些不同的事情。 linux 不是虚拟机。
  • @CharlieBurns 非常感谢,现在知道了。
  • 我不推荐 GNU coreutils 作为开始,因为它们包含各种针对晦涩和过时操作系统的解决方法。我个人从阅读 BSD 实用程序的源代码中学到了很多东西,这些实用程序在代码方面更加简洁(尽管它们有时使用 BSD 特定的 API,但你会发现这些)。
  • VMS 还存在吗?这些天似乎和 CP/M 一样重要。

标签: c linux gnu-coreutils


【解决方案1】:

了解评论的第一步是了解 VMS 是什么。所以这里有一个链接: http://en.wikipedia.org/wiki/OpenVMS

下一步是了解重定向和通配符。在 Linux 和 unix 家族的其他成员中,类似的命令

cat foo* > /tmp/foolist

将调用catmain 函数,其中argv 包含foo* 的匹配项。在输入main 之前,输出文件/tmp/foolist 已经以stdout 打开。

VMS 不这样做。 cat 将在其 argv 中找到未扩展的字符串 "foo*" 和重定向运算符 >。因此,实用程序本身 (cat) 必须进行重定向(打开输出文件)和通配符(将 "foo*" 替换为 "foo1", "foo2", "foo3")。这就是initialize_main 在 VMS 上所做的事情。在 unix 上,它什么也不做(“通常是一个 noop”)。

【讨论】:

    【解决方案2】:

    这是过去留下的。 OpenVMS是过去与Unix大致竞争的操作系统。世界上仍有相当数量的 OpenVMS 在运行,但 HP 已经放弃了对它的支持,并且它将在未来 10 到 15 年内消失。

    无论如何,这个函数在 OpenVMS 上使用,以允许在 VMS 上进行 stdout 和 stderr 重定向。

    由于 Unix 上的 cat foo.txt > stuff.txtcat 命令只能看到一个参数 foo.txt,但在对 > 符号一无所知的 VMS 上,cat 命令看到 3 个参数。

    VMS上initialize_main里面的代码,允许基本的unix风格的命令支持输出重定向,例如ls

    OpenVMS 后来添加了一个名为pipe 的命令,它允许通过任何命令进行重定向。

    您可以在此处查看 VMS 上的 initialize_main 源代码:Link

    【讨论】:

      猜你喜欢
      • 2022-06-20
      • 1970-01-01
      • 2011-04-15
      • 2011-03-02
      • 2014-08-04
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多