Vollständige Version anzeigen : C Textausgabe in Kindprozessen


Nerobone
08.04.2014, 17:17

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!


#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!

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Murdoc
08.07.2014, 18:57

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.

#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;
}



$ 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


Kolazomai
09.07.2014, 10:24

Hallo,

warum benutzt du denn nicht popen() (;linux;die~net/man/3/popen) um dein Problem zu lösen?

#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


Ähnliche Themen zu C Textausgabe in Kindprozessen


raid-rush.ws | Imprint & Contact pr