Ich versuche, Rohre zu verstehen. Ich habe dieses kleine Programm, das eine Pipe verwendet, um eine Nachricht von dem übergeordneten Prozess zu seinem Kind zu senden. Das Kind erhält alle 3 Nachrichten, aber anstatt es zu beenden, bleibt es nach dem Lesen der letzten Nachricht hängen. Was mache ich falsch? Vielen Dank.Programm stoppt nicht nach dem Lesen von Rohr
PS: Ich habe festgestellt, dass es funktionieren würde, wenn ich für 2 Sekunden in der While-Schleife von den Eltern schlafen würde.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(){
int desc[2];
pipe(desc);
int pid = fork();
if(pid == 0){
while(1){
sleep(1);
char buffer[16];
if(read(desc[0], buffer, 16) != 16){
printf("Error or finished");
exit(0);
};
printf("Child: message recieved - '%s'\n", buffer);
}
close(desc[1]);
}
if(pid > 0){
int i=0;
while(i <= 2){
char buffer[100];
i++; char x[10];
strcpy(buffer, "Hello, child!");
sprintf(x, " %d", i);
strcat(buffer, x);
if(write(desc[1], buffer, 16) != 16){
printf("Error");
exit(0);
};
}
close(desc[0]);
}
return 0;
}
Sie haben recht mit "close write end in writer", aber nach diesem Punkt wird das übergeordnete Element beendet und somit wird der Dateideskriptor trotzdem geschlossen. Aber +1, um explizit zu sein. Der Austrittsmechanismus eines Kindes erscheint auch nicht natürlich. Aber das ist ein anderes Thema, denke ich. – usr