next up previous
Next: POSIX Threads Up: Primitive zum parallelen Programmieren Previous: m_fork

Unterabschnitte

fork

fork(void) erzeugt einen neuen Prozess (child), der eine genaue Kopie des aufrufenden Prozesses (parent) ist.

Natürlich muß es trotzdem möglich sein, zwischen child und parent zu unterscheiden, da sonst beide Prozesse genau die gleiche Aufgabe erledigen würden.

Der Hauptunterschied ist, daß der child-Prozess als parent process ID die Kennung des parent-Prozesses hat.

Eine häufige Anwendung von fork ist, im Kindprozess einfach mittels exec ein anderes Programm zu starten.

Beispiel:

/* 
 * fork.c - ein fork beispielprogramm
 *
 * oliver schoenbrunner
 *
 * 26.4.1999
 *
 */

#include <stdio.h>

#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv) {

  int new_process;

  new_process = fork();

  if (new_process<0)  fprintf(stderr, "error beim Aufruf von fork()\n");
  if (new_process==0) {
    fprintf(stdout, "Kindprozess koennte zB ein anderes Programm starten (mittels exec())\n");
    fprintf(stdout, "  Child: PID  : %d\n", getpid());
fprintf(stdout, "  Child: PPID : %d\n", getppid());
}
  if (new_process>0)  {
    fprintf(stderr, "Elternprozess setzt das Programm fort\n");
    fprintf(stdout, "  Parent: PID : %d\n", getpid());
fprintf(stdout, "  Parent: PPID: %d\n", getppid());
}

  return 0;

}

exec*

exec* in all seinen Formen überlagert einen bestehenden Prozess mit einem neuen Programm, das durch eine gewöhnliche ausführbare Datei bestimmt wird. Es kann kein return aus einem erfolgreich ausgeführten exec geben, da der Prozess vollständig überlagert wird.

Die verschiedenen Varianten von exec unterscheiden sich hauptsächlich dahingehend, auf welche Art Parameter in das neue Programm üebergeben werden.




Mail to: Oliver Schönbrunner