2016-04-28 14 views
1

Ich versuche, ein einfaches Beispiel mit der exec() und fork(). Aber ich habe ein kleines Problem und ich habe nicht verstanden, wie es funktioniert.Exec (CD und ls) und Fork Anruf C

Der Code hat 3 Forks und in jedem Kind ruft er eine Exec auf. Der erste Systemaufruf lautet "wer", nach "cd" und "ls -ls". Mein Problem ist: nachdem "cd" gemacht wurde, zeigt der "ls" Aufruf nicht die Dateien im aktuellen Verzeichnis an. Also, wenn ich 'dir1/dir2' habe, mache ich "cd", aber wenn ich "ls" mache, zeigt das Programm die Dateien in 'dir/dir2' an.

Es ist möglich, dass ein Kind auf die Änderungen eines anderen Kindes zugreift?

while (cont_arg < 3) { 
     pid_t pid = fork(); 
     if (pid == -1) { 
      perror("fork failed"); 
      exit(EXIT_FAILURE); 
     } else if (pid == 0) { 
      printf("\n---: child process ID -> %d.\n", getpid()); 
      printf("command --- > %s\n", command[cont_arg]); 
      execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL); 
      _exit(EXIT_SUCCESS); 
     } else { 
      wait(&status); 
     } 
     cont_arg++; 
    } 

Antwort

1

Sie nicht execlp verwenden Sie den Befehl cd, das ist ein Shell-builtin Befehl ausgeführt werden soll, stattdessen sollten Sie chdir anrufen, wenn Sie auf Linux sind, das aktuelle Arbeitsverzeichnis des Prozesses zu ändern.

int chdir(const char *path); 

auch den Rückgabewert von execlp überprüfen:

int ret = execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL); 
if (ret < 0) { 
    fprintf(stderr, "exec failed for %s\n", command[cont_arg]); 
    exit(EXIT_SUCCESS); // will reach here only if exec failed 
} 
+0

Vielen Dank! Ich habe das Chdir benutzt und es hat funktioniert. –

+0

eine letzte Frage, wenn ich chdir verwende, werde ich das aktuelle Verzeichnis zu zukünftigen Kindern, die ich mit der Gabel oder nur das Verzeichnis des aktuellen Kind erstellen kann? –

+0

@GabrielaCavalcante Ein über fork (2) erstellter Kindprozess erbt das aktuelle Arbeitsverzeichnis des übergeordneten Benutzers. Also, ja, alle Kinder werden das veränderte haben. – fluter

1

Der erste Systemaufruf "der"

Nein, das sind keine Systemaufrufe. Der Begriff "Systemaufruf" wird für etwas völlig anderes verwendet. who und ls sind Programme, die Sie mit exec ausführen. cd auf der anderen Seite ist ein Shell-Befehl. So ausgeführt cd, auch wenn Sie es richtig getan haben, wird keine Wirkung haben. Seit cd teilt dem Shell-Prozess nur mit, seinen internen Status zu ändern, der nur für die Shell und ihre untergeordneten Prozesse sichtbar ist.

Leider sehen Sie nicht, dass die exec von cd fehlschlägt, weil Sie nicht auf Fehler von execlp überprüfen. Überprüfen Sie den Rückgabewert von exec und behandeln Sie diese Fehler und die Dinge werden klarer.

+0

Dank! Die Lehrer haben das nicht gut erklärt, ich werde versuchen, ein Buch über dieses Thema zu finden. –

Verwandte Themen