Je cherche à transmettre des informations entre un parent et un enfant. Actuellement, je passe du STDERR du parent au STDIN de l'enfant et je lis le STDOUT de l'enfant en lisant l'autre extrémité du descripteur de fichier. J'ai fait ce qui suit ci-dessous mais je suis aux prises avec l'enfant qui a besoin de sortir avant que je puisse lire. Comment puis-je lire ligne en permanence par la ligne de sortie de l'enfantLire et écrire des processus enfants en cours de fonctionnement
boucles entre l'enfant traite
for (int currentP = 0; currentP < inputs.playerCount; currentP++) {
char currentPlayerC[2];
sprintf(currentPlayerC, "%d", currentP);
char* currentPlayerT = argv[3+currentP];
int fds[2];
int fds1[2];
pipe(fds);
pipe(fds1);
char buff[10];
memset(buff, 0, sizeof(buff));
if ((pids[currentP] = fork()) < 0) {
perror("fork");
abort();
} else if (pids[currentP] == 0) { //Child
close(fds[PIPE_READ]);
close(fds1[PIPE_WRITE]);
dup2(fds[PIPE_WRITE], STDOUT_FILENO);
dup2(fds1[PIPE_READ], STDIN_FILENO);
close(fds1[PIPE_READ]);
close(fds[PIPE_WRITE]);
execlp(CHILD PROCESS THAT PRINTS TO STDOUT READS FROM STDIN))
_exit(0);
return BADSTART;
} else { //parent
dup2(fds1[PIPE_WRITE], STDERR_FILENO);
close(fds[PIPE_WRITE]);
close(fds1[PIPE_READ]);
fprintf(stderr, "game_over\n"); //ENDS CHILD
read(fds[PIPE_READ], buff, sizeof(buff));
//Will continue forever unless I put in game_over
close(fds1[PIPE_WRITE]);
close(fds[PIPE_READ]);
}
}
Vous recevez la sortie de l'enfant dès que l'enfant écrit la sortie. Vous devez peut-être ajuster la stratégie de mise en mémoire tampon de l'enfant, par ex. en désactivant la mise en mémoire tampon pour 'stdout' ou en appelant' fflush() 'aux endroits appropriés. – fuz
La question OP concerne un problème d'exécution, mais le code affiché n'est qu'un fragment. Veuillez poster un [mcve] – user3629249
concernant: '_exit (0); return BADSTART; 'L'instruction 'return' ne sera JAMAIS exécutée – user3629249