2013-10-09 21 views
11

Sto leggendo il codice sorgente di coreutils per imparare a programmare sotto linux.Cosa fa initialize_main (& argc, & argv)?

Trovo che nella maggior parte dei programmi come ls.c, cat.c, invochino la funzione macro initialize_main() nelle prime righe. Così ho guardato in system.h per trovare l'attuazione:

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

non capisco il motivo per cui definisco una macro e non capisco il commento.

+0

se si osserva dove e come queste macro stanno utilizzando in quel file che si sarebbe venuto a sapere. – Gangadhar

+2

Il commento lo spiega abbastanza bene "Generalmente un noop, ma usato in particolare per il VMS nativo.". Quindi sotto linux, è un niente, niente. VMS probabilmente fa qualcosa di diverso per la gestione degli argomenti. linux non è VMS. –

+0

@CharlieBurns Grazie mille, capito ora. – f00l

risposta

16

Il primo passo per comprendere il commento è sapere che cos'è VMS. Quindi, ecco un collegamento per questo: http://en.wikipedia.org/wiki/OpenVMS

Il passaggio successivo è capire il reindirizzamento e il carattere jolly. In Linux e gli altri membri della famiglia UNIX, un comando come

cat foo* > /tmp/foolist 

chiamerà la funzione di maincat con argv contenente le partite per foo*. Il file di output /tmp/foolist sarà già aperto come stdout prima che venga immesso lo main.

VMS non lo fa. cat troverà la stringa non espansa "foo*" e l'operatore di reindirizzamento > nel suo argv. Quindi l'utilità stessa (cat) deve eseguire il reindirizzamento (apertura del file di output) e caratteri jolly (sostituendo "foo*" con "foo1", "foo2", "foo3"). Questo è ciò che farà initialize_main su VMS. In Unix, non farà nulla ("Generalmente un noop").

+0

Dannazione, mi ha battuto :) – Salgar

7

Questo è rimasto da tempi andati. OpenVMS è un sistema operativo che in passato ha gareggiato con Unix. C'è ancora una discreta quantità di OpenVMS in esecuzione nel mondo, ma HP ha abbandonato il supporto per questo e andrà via nei prossimi 10-15 anni.

In ogni caso, questa funzione viene utilizzata su OpenVMS per consentire il reindirizzamento stdout e stderr su VMS.

Dal cat foo.txt > stuff.txt su Unix, il comando cat vede un solo argomento foo.txt, ma su VMS, che non sa nulla del simbolo >, il comando cat vede 3 argomenti.

Il codice all'interno initialize_main sul SCP, permette comanda lo stile di base unix per supportare il reindirizzamento uscita, come ls e

OpenVMS successivamente aggiunto un comando chiamato pipe che permette il reindirizzamento di lavorare con qualsiasi comando.

È possibile visualizzare il codice sorgente per initialize_main su VMS qui: Link