我正在阅读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
我不明白为什么要定义这样一个宏而且我不理解这个评论。
答案 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