OK Ich habe ein Programm, das zwei Pipes erstellt -> gabeln -> die stdin und stdout des Kindes werden zu einem Ende jeder Pipe umgeleitet -> der Elternteil ist mit den anderen Enden der Pipes verbunden und versucht, den damit verbundenen Stream zu lesen die Ausgabe des Kindes und drucke es auf den Bildschirm (und ich werde es auch schreiben, um den Eingang des Kindes schließlich).kann nicht aus dem Stream gelesen werden, bis das Kind beendet wird?
Das Problem ist, wenn der Elternteil versucht, den Ausgabe-Stream des Kindes zu fgets, es einfach anhält und wartet, bis das Kind fgets stirbt und dann die Ausgabe druckt. Wenn das Kind nicht austritt, wartet es für immer. Was ist los? Ich dachte, dass fgets blockieren würde, bis SOMETHING im Stream war, aber nicht den ganzen Weg blockieren, bis das Kind seine Dateideskriptoren aufgibt. Hier
ist der Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
FILE* fpin;
FILE* fpout;
int input_fd[2];
int output_fd[2];
pid_t pid;
int status;
char input[100];
char output[100];
char *args[] = {"/somepath/someprogram", NULL};
fgets(input, 100, stdin); // the user inputs the program name to exec
pipe(input_fd);
pipe(output_fd);
pid = fork();
if (pid == 0) {
close(input_fd[1]);
close(output_fd[0]);
dup2(input_fd[0], 0);
dup2(output_fd[1], 1);
input[strlen(input)-1] = '\0';
execvp(input, args);
}
else {
close(input_fd[0]);
close(output_fd[1]);
fpin = fdopen(input_fd[1], "w");
fpout = fdopen(output_fd[0], "r");
while(!feof(fpout)) {
fgets(output, 100, fpout);
printf("output: %s\n", output);
}
}
return 0;
}
Hmmm, Sie haben Recht. Wenn ich die Ausgabe fflush, funktioniert es. Das Problem ist, ich habe keine Möglichkeit, das Kind zu kontrollieren. Ich kann es nur mit meinem Testprogramm steuern, da ich den Quellcode bearbeiten kann ... Wie stelle ich sicher, dass jedes Programm, das execvped ist, seine Ausgabe geleert oder nicht gepuffert hat oder etwas ... arghhh – BobTurbo
Warten Sie, hier ist der Code des Testkindes: printf ("Eingabe eingeben: \ n"); fflush (stdout); wenn ich die/n oder die fflush nehme, verzögert es .. ich brauche es um es zu lesen ohne eine/n und .. ohne mich fflushing. – BobTurbo
Ich sollte wahrscheinlich nicht fgets verwenden ... aber nicht sicher, dass das Flushing-Bit löst. – BobTurbo