initialize_main(&argc, &argv)是什么意思?

20

我正在阅读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

我不明白为什么要定义这样的宏,也不明白这个注释。


如果你观察这些宏在文件中的使用位置和方式,你就会知道。 - Gangadhar
2
注释相当清楚了:“通常是无操作,但特别用于本地VMS”。所以在Linux下,它是nop,什么也不做。对于参数处理,VMS可能会有不同的操作。Linux不是VMS。 - Charlie Burns
2
我不建议初学者使用GNU coreutils,因为它们包含各种针对古老和过时操作系统的解决方案。个人而言,我从阅读BSD实用程序的源代码中获益匪浅,这些代码在编码方面更加清晰(虽然有时会使用BSD特定的API,但你可以找到这些内容)。 - Fred Foo
很不幸,它是这样的。 - Salgar
@larsmans 我会试一下。我刚刚读完了apue。 - f00l
显示剩余2条评论
2个回答

23
理解评论的第一步是了解VMS是什么。所以这里有一个链接: http://en.wikipedia.org/wiki/OpenVMS 下一步是理解重定向和通配符。在Linux和其他Unix家族成员中,像这样的命令
cat foo* > /tmp/foolist

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

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


11
这是过去留下的遗物。OpenVMS是一种操作系统,曾经与Unix竞争。世界上仍有相当数量的OpenVMS在运行,但惠普已停止对其提供支持,并将在未来10-15年内淘汰它。
无论如何,此函数用于允许在VMS上重定向stdout和stderr。
由于在Unix上的cat foo.txt > stuff.txtcat命令只看到一个参数foo.txt,但在不知道>符号的VMS上,cat命令看到3个参数。 initialize_main中的代码在VMS上允许基本的unix风格命令支持输出重定向,例如ls
OpenVMS后来添加了一个名为pipe的命令,允许通过任何命令进行重定向。
您可以在此处查看VMS上initialize_main的源代码:链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接