2016-03-31 1 views
0

Kann mir jemand erklären, was argc und argv in diesem Code macht und warum diese Variablen Parameter in der Hauptfunktion sind? Wir hatten in Vorträgen Beispiele, die diese beiden Variablen zeigten, also benutze ich sie, ohne zu wissen, was sie tun.Betriebssystemprozesse in .c

main (argc, argv) 
    char *argv[]; 
    { 
     int fd; 
     extern int errno; 
     if(argc < 2){ 
      fprintf(stderr, "No file\n"); 
      exit(1); 
     } 

     if((fd = creat(argv[1], 0777)) < 0){ 
      fprintf(stderr, "Cannot creat file %s\n", argv[1]); 
      exit(1); 
     }  


    switch (fork()) { 
     case -1: 
      fprintf(stderr, "Fork error\n"); 
      exit(1); 
     case 0: 
      close(1); 
      dup(fd); 
      close(fd); 
      execl("/bin/pwd", "pwd", NULL); 
      perror("Exec"); 
      break; 
     default: 
      close(fd); 

    } 


    exit(0); 
    } 
+6

Oh Gott, alte K & R-Stil-Deklarationen, implizite 'int' ... Wer dies als Vorlesungsmaterial im Jahr 2016 gibt, sollte dauerhaft vom Unterricht verbannt werden. – EOF

+0

Sie sind optionale Befehlszeilenparameter, die mit dem Programm übergeben werden. argc gibt die Anzahl der Parameter an, argv enthält Zeiger auf die eigentlichen Strings. – Unimportant

+0

Das, mein Freund, sieht aus wie ein verdammt alter C-Code, sagen wir Anfang der 80er Jahre. Ich hoffe aufrichtig, dass dies nicht von tatsächlichen Kursunterlagen stammt ... – fvu

Antwort

0

argc ist ein int das Programm die Anzahl der Argumente in das Programm durch das Betriebssystem übergeben zu geben. argv ist ein Array von nullterminierten Strings, die die tatsächlichen Argumente enthalten, die an das Programm übergeben werden. Die genauen Parameter sind vom Betriebssystem abhängig, aber argv[0] ist oft der ausführbare Name einschließlich des Pfads, während argv[argc] immer ein NULL Zeiger ist (Dank @WeatherVane, um dies zu verdeutlichen) Alle Versionen des C-Standards benötigen argv[argc] als NULL-Zeiger, und alle vorherigen Präzedenzfälle für gehostete Systeme erforderten sie ebenfalls ("freistehend" - alias eingebettete Systeme laufen unter verschiedenen Regeln, selbst jetzt).

Nicht alle Programme erfordern Befehlszeilenargumente, aber sie sind ein wesentlicher Bestandteil fast jedes Betriebssystems.

Der C-Standard erfordert die folgende Definition, wenn beide Parameter verwendet werden:

int main(int argc, char *argv[]) 
... 

I Zweifel K & R C mehr in Produktionscode verwendet wird.

+0

'argv [0]' ist normalerweise der Dateiname der ausführbaren Datei. 'argv [argc]' ist normalerweise ein Endmarker 'NULL' Zeiger. –

+1

@WeatherVane: Es ist nicht "in der Regel ein' NULL' Zeiger ", für gehostete Implementierungen muss es sein *: C11 Entwurf Standard n1570 * 5.1.2.2.1 Programmstart 2 Wenn sie deklariert sind, die Parameter der Hauptfunktion muss folgende Einschränkungen beachten: - Der Wert von argc soll nicht negativ sein. - argv [argc] soll ein Null-Zeiger sein. * – EOF

+1

@EOF Ich war vorsichtig wegen der Verwendung der 'exec'-Familie von Funktionen, von der ich denke, dass sie keinen ausführbaren Namen als' argv [0] 'benötigen. Aber ich habe mich nicht geirrt, danke. –