18

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

我不明白为什么要定义这样的宏,也不明白评论。

4

2 回答 2

21

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

下一步是了解重定向和通配符。在 Linux 和 unix 家族的其他成员中,类似的命令

cat foo* > /tmp/foolist

将调用包含匹配项的withmain函数。输出文件将像以前一样打开。catargvfoo*/tmp/fooliststdoutmain

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

于 2013-10-09T16:00:43.560 回答
10

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

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

由于cat foo.txt > stuff.txt在 Unix 上,该cat命令只能看到一个参数,但在对符号foo.txt一无所知的 VMS 上,该命令会看到 3 个参数。>cat

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

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

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

于 2013-10-09T16:03:55.160 回答