Erwin: C: Prozess in Hintergrund verbannen

Hi Forum,

heute mal ein wenig C:
Ich möchte ein zusätzliches Programm im Hintergrund ausführen, also forke ich einen neuen Prozess und überschreibe diesen mit exec:

  
pid_t pid;  
switch (pid = fork ()) {  
  case -1:  
    perror("fork()");  
    fprintf(stderr, "Error beim Aufruf von fork()\n");  
    return EXIT_FAILURE;  
  case 0:  
    /* fprintf(stdout, "Child is running: PPID : %d\n",     getppid()); */  
    execlp ("./my_prog", "my_prog", param1, NULL);  
    /* printf("Wird niemals mehr erreicht ...\n"); */  
    break;  
  default:  
    if (waitpid (pid, NULL, 0) != pid) {  
      perror ("waitpid()");  
      return EXIT_FAILURE;  
    }  
}  

my_prog macht einfach nur 30 Sekunden lang nix, damit ich sehe, obs wirklich in den Hintergrund wandert. Leider wartet nun mein Eltern-Prozess, bis das Kind beendet wurde, es passiert also nicht wirklich etwas.

Jemand eine Idee oder sogar eine Lösung :-)

Danke
  Erwin

  1. Hallo Erwin,

    der Parent-Prozess läuft in den default-Zweig, wo er mit waitpid() auf eine Statusänderung des Child-Prozesses wartet. Das passiert bei Dir erst dann, wenn der Child-Prozess beendet wird.

    Du kannst an waitpid() als 3. Parameter die Option WNOHANG mitgeben. Die Manpage sagt dazu:

    WNOHANG         The waitpid() function will not suspend exe-
                    cution  of  the calling process if status is
                    not immediately available  for  one  of  the
                    child processes specified by pid.

    Eine bessere, aber kompliziertere Alternative ist es, im Parent einen Signalhandler für SIGCHLD einzubauen und dort den Aufruf von waitpid() durchzuführen. Dann kann waitpid() aus dem default-Zweig raus, und beide Prozesse laufen parallel.

    Viele Grüße
    Frank

    1. Hi Frank,

      danke für den Tipp - jetzt klappt alles :-)

      Viele Grüße
        Erwin