2013-10-09 14 views
11

Ich lese Coreutils Quellcode, um die Programmierung unter Linux zu lernen.Was macht initialize_main (& argc, & argv)?

Ich finde, dass in den meisten Programmen wie ls.c, cat.c, die Makrofunktion initialize_main() in den ersten paar Zeilen aufrufen. Also schaute ich in system.h die Umsetzung zu finden:

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

Ich verstehe nicht, warum so definieren, ein Makro, und ich verstehe nicht, den Kommentar.

+0

, wenn Sie feststellen, wo und wie diese Makros werden, dass Dateien, die Sie kommen würde, wissen. – Gangadhar

+2

Der Kommentar erklärt es einigermaßen gut "Generell ein Noop, aber vor allem für native VMS verwendet.". Also unter Linux ist es ein NOP, nichts. VMS macht wahrscheinlich etwas anderes für die Behandlung von Argumenten. Linux ist kein VMS. –

+0

@CharlieBurns Vielen Dank, habe es jetzt. – f00l

Antwort

16

Der erste Schritt zum Verständnis des Kommentars ist zu wissen, was VMS ist. Also hier ist ein Link dafür: http://en.wikipedia.org/wiki/OpenVMS

Der nächste Schritt ist Umleitung und Platzhalter zu verstehen. Unter Linux und anderen Mitgliedern der Unix-Familie, ein Befehl wie

cat foo* > /tmp/foolist 

ruft die main Funktion von cat mit argv die Matches für foo* enthalten. Die Ausgabedatei /tmp/foolist ist bereits als stdout geöffnet, bevor main eingegeben wird.

VMS tut das nicht. cat wird die nicht erweiterte Zeichenfolge "foo*" und den Umleitungsoperator > in seinem Argument finden. Daher muss das Dienstprogramm selbst (cat) die Umleitung (Öffnen der Ausgabedatei) und das Platzhalterzeichen (Ersetzen von "foo*" durch "foo1", "foo2", "foo3") ausführen. Das macht initialize_main auf VMS. Unter Unix tut es nichts ("Im Allgemeinen ein Noop").

+0

Verdammt, schlag mich :) – Salgar

7

Dies ist aus vergangenen Zeiten übrig. OpenVMS ist ein Betriebssystem, das in der Vergangenheit in etwa mit Unix konkurrierte. Es gibt immer noch eine ordentliche Menge an OpenVMS auf der Welt, aber HP hat die Unterstützung dafür fallen lassen und wird in den nächsten 10-15 Jahren weggehen.

Wie auch immer, diese Funktion wird auf OpenVMS verwendet, um stdout und stderr Umleitung auf VMS zu erlauben.

Seit cat foo.txt > stuff.txt auf Unix, der cat Befehl sieht nur ein Argument foo.txt, sondern auf VMS, die nichts von dem > Symbol kennt, der cat Befehl sieht drei Argumente.

der Code innerhalb initialize_main auf VMS ermöglicht die grundlegende UNIX-Stil-Befehle Ausgabeumleitung, wie ls und

OpenVMS- spätere Unterstützung hinzugefügt ein Befehl pipe aufgerufen, die Umleitung ermöglicht über jeden Befehl zu arbeiten.

Sie können den Quellcode für initialize_main auf VMS sehen hier: Link