C Textausgabe in Kindprozessen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Nerobone, 8. April 2014 .

  1. 8. April 2014
    Hallo,

    ich habe eine Frage bez. meiner Kindprozesse. Ich möchte gerne ein "hallo" senden wenn es in den Kindprozess geht und ein "bye" wenn es wieder raus geht.
    Nur leider gelingt mir das nur mit dem "hallo".
    Sprich ich sende ein printf mit "hallo" ab, starte/beende einen Prozess und das gewünschte "bye" kommt nicht.
    Was habe ich hier nicht beachtet?
    Wäre für Hilfe dankbar!


    Code:
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    int main()
    {
    int P2, P3;
    
    P2 = fork();
    if (P2 < 0) printf("Fehler beim Forken\n");
    
    if (P2 > 0) {
     printf("[PID:%d, PPID: %d] Vater erster Aufruf\n", getpid(), getppid());
     sleep(2);
    
    P3 = fork();
    if (P3 < 0) printf("Fehler beim Forken\n");
    
    if (P3 > 0) {
     printf("[PID: %d, PPID: %d] Vater zweiter Aufruf\n", getpid(), getppid());
     sleep(2);
     }
     
    if (P3 == 0){
     printf("[PID: %d, PPID: %d] Kind 2\n", getpid(), getppid());
    
     printf("Hallo in Kind 2\n");
    
     char *argumente[3];
     argumente[0] = "killall";
     argumente[1] = "xeyes";
     argumente[2] = NULL;
     execvp ("killall", argumente);
    
     printf("Tschuess aus Kind 2\n");
     }
     
    } 
    if (P2 == 0){
     printf("[PID: %d, PPID: %d] Kind 1\n", getpid(), getppid());
    
     printf("Hallo in Kind 1\n");
     
     char *arguments[3];
     arguments[0] = "xeyes";
     arguments[1] = "+shape";
     arguments[2] = NULL;
     execvp ("xeyes", arguments);
    
     printf("Tschuess aus Kind 1\n");
     }
     
    return 0;
    } 
     
     
    Gruss!
     
  2. 8. Juli 2014
    Zuletzt bearbeitet: 9. Juli 2014
    AW: C Textausgabe in Kindprozessen

    execvp ersetzt deinen fork() mit dem Prozess den du damit erzeugst.
    D.h.: alles was du danach machst geht unter.

    Davon abgesehen würde dir hier zu callbacks raten anstatt alles in main() zu verbauen.

    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <assert.h>
    
    #include <sys/types.h>
    #include <sys/wait.h>
    
    typedef void(*task_cb_t)(void);
    
    void cb_1(void) 
    {
     /* aufgaben für kind 1 */
     puts("aufgabe 1");
     sleep(2);
    }
    
    void cb_2(void) 
    {
     /* aufgaben für kind 2 */
     puts("aufgabe 2");
     sleep(2);
    }
    
    int do_spawn(int id, task_cb_t cb) 
    {
     int pid = fork();
     
     if (pid == 0) { 
     printf("hallo von kind %d\n", id);
     
     /* yada yada yada */
     cb();
     
     printf("tschuess von kind %d\n", id);
     exit(0); /* kein return */
     }
     
     return pid;
    }
    
    int main(void)
    {
     int pid_0 = getpid();
     int pid_1;
     int pid_2;
     int status;
     
     pid_1 = do_spawn(1, cb_1);
     
     if (pid_1 < 0)
     puts("fehler bei fork (1)");
     else {
     printf("[PID:%d, PPID:%d] erster aufruf\n", pid_1, pid_0);
     
     /* nächsten prozess starten sobald der erste fertig ist */
     if (waitpid(pid_1, &status, 0)) {
     pid_2 = do_spawn(2, cb_2);
     
     if (pid_2 < 0)
     puts("fehler bei fork (2)");
     else {
     printf("[PID:%d, PPID:%d] zweiter aufruf\n", pid_2, pid_0);
     
     /* kein if/else, da wir keine weiteren prozesse mehr starten */
     /* ziemlich egal ob der aufruf scheitert */
     waitpid(pid_2, &status, 0);
     }
     } else
     /* wenn das passiert musst du selbst herausfinden warum */
     assert(0);
     }
     
     return 0;
    }
    
    
    Code:
    $ gcc -std=c99 -o fork fork.c && ./fork
    [PID:6495, PPID:6494] erster aufruf
    hallo von kind 1
    aufgabe 1
    tschuess von kind 1
    [PID:6496, PPID:6494] zweiter aufruf
    hallo von kind 2
    aufgabe 2
    tschuess von kind 2
    
    
     
  3. 9. Juli 2014
    AW: C Textausgabe in Kindprozessen

    Hallo,

    warum benutzt du denn nicht popen() um dein Problem zu lösen?

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
     FILE *p1 = NULL;
     FILE *p2 = NULL;
     
     // Aufruf blockiert nicht!
     p1 = popen("killall xeyes", "r");
     if (p1 == NULL)
     {
     perror("p1 popen");
     return EXIT_FAILURE;
     }
     
     p2 = popen("xeyes +shape", "r");
     if (p2 == NULL)
     {
     perror("p2 popen");
     return EXIT_FAILURE;
     }
     
     // blockiert
     pclose(p1);
     pclose(p2);
     
     return EXIT_SUCCESS;
    }
    Damit kannst du auch noch mit dem Prozess kommunizieren, wenn das nötig ist.

    Mfg,

    Kolazomai
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.