#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! + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren