initialize_main(& argc,& argv)做什么?

时间:2013-10-09 15:48:06

标签: c linux gnu-coreutils

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

我不明白为什么要定义这样一个宏而且我不理解这个评论。

2 个答案:

答案 0 :(得分:18)

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

下一步是了解重定向和通配符。在Linux和unix系列的其他成员中,有一个像

这样的命令
cat foo* > /tmp/foolist

将调用main的{​​{1}}函数,cat的{​​{1}}包含argv的匹配项。在输入foo*之前,输出文件/tmp/foolist已在stdout处打开。

VMS没有这样做。 main会在其argv中找到未展开的字符串cat和重定向运算符"foo*"。因此,实用程序本身(>)必须执行重定向(打开输出文件)和通配符(将cat替换为"foo*")。那就是"foo1", "foo2", "foo3"将对VMS做什么。在unix上,它什么都不做("一般是noop")。

答案 1 :(得分:8)

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

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

从Unix上的cat foo.txt > stuff.txt开始,cat命令只能看到一个参数foo.txt,但是在VMS上,它对>符号一无所知,{{1} }命令看到3个参数。

VMS上的cat内的代码允许基本的unix样式命令支持输出重定向,例如initialize_main

OpenVMS后来添加了一个名为ls的命令,允许重定向通过任何命令工作。

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