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

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的函数catargv含有比赛为foo*.输入文件/tmp/fooliststdoutmain输入之前打开.

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


Sal*_*gar 8

这已经过去了.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的源代码:链接