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

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

我发现在像ls.c,cat.c这样的大部分程序中,它们在头几行调用macros函数initialize_main()。 所以我看着system.hfind实现:

/* 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 

我不明白为什么要定义这样一个macros,我不明白这个意见。

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

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

 cat foo* > /tmp/foolist 

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

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

这已经过去了。 OpenVMS是一个在过去与Unix大致竞争的操作系统。 世界上还有相当数量的OpenVMS正在运行,但惠普已经放弃了对它的支持,在未来的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的源代码: 链接