f00*_*00l 15 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
Run Code Online (Sandbox Code Playgroud)
我不明白为什么定义这样的宏,我不明白这个评论.
小智 19
理解评论的第一步是了解VMS是什么.所以这里有一个链接:http: //en.wikipedia.org/wiki/OpenVMS
下一步是了解重定向和通配符.在Linux和unix系列的其他成员中,一个命令就像
cat foo* > /tmp/foolist
Run Code Online (Sandbox Code Playgroud)
将调用main的函数cat与argv含有比赛为foo*.输入文件/tmp/foolist将stdout在main输入之前打开.
VMS不这样做.cat将在其argv中找到未展开的字符串"foo*"和重定向运算符>.因此,实用程序本身(cat)必须执行重定向(打开输出文件)和通配符(替换"foo*"为"foo1", "foo2", "foo3").这就是initialize_mainVMS的功能.在unix上,它什么都不做("通常是noop").
这已经过去了.OpenVMS是一个过去与Unix大致竞争的操作系统.世界上还有相当数量的OpenVMS在运行,但惠普已经放弃了对它的支持,它将在未来10到15年内消失.
无论如何,这个函数在OpenVMS上使用,允许在VMS上进行stdout和stderr重定向.
因为cat foo.txt > stuff.txt在Unix上,cat命令只能看到一个参数foo.txt,但是在VMS上,它对>符号一无所知,cat命令会看到3个参数.
initialize_mainVMS 内部的代码允许基本的unix样式命令支持输出重定向,例如ls和
OpenVMS后来添加了一个命令pipe,允许重定向通过任何命令工作.
您可以在此处查看VMS上initialize_main的源代码:链接