Das Ziel meines Programms ist es, zwei Pipes und zwei Prozesse zu erstellen, die sich gegenseitig lesen und schreiben auf die Pipes.Pipe() und fork()
- Prozess P1 liest aus Rohr c1 und schreibt in das Rohr c2
- Prozess P2 liest aus Rohr c2 und schreibt in das Rohr c1
bis die Lesenummer aus dem Rohr weniger als BIG_INT_STOP Die beiden Prozesse erhöhen weiterhin die Anzahl der Rohre. Sobald diese Bedingung zutrifft, wird zuerst der Prozess gelesen, die Pipes geschlossen, die Pipes geschlossen und die Nummer ausgedruckt. Das Problem ist: Wenn der Prozess p2 vor p1 endet und wenn der Prozess p1 vor p2 endet, geht er in die Schleife. Können Sie mir erklären warum?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysinfo.h>
#include <sys/wait.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#define BIG_INT_STOP 40
#define TEST_ERROR if (errno) {fprintf(stderr, \
"%s:%d: PID=%5d: Error %d (%s)\n", \
__FILE__, \
__LINE__, \
getpid(), \
errno, \
strerror(errno));}
int main(){
int c1[2], c2[2], p1, p2, z;
long a = 0, c;
pipe(c1);
pipe(c2);
write(c1[1], &a, sizeof(a));
write(c2[1], &a, sizeof(a));
p1 = fork();
p2 = fork();
switch(p1){
case -1:
TEST_ERROR;
exit(EXIT_FAILURE);
case 0:
read(c1[0], &c, sizeof(c));
while(c != BIG_INT_STOP){
++c;
write(c2[1], &c, sizeof(c));
read(c1[0], &c, sizeof(c));
}
close(c1[0]);
close(c1[1]);
close(c2[0]);
close(c2[1]);
printf("p1: %ld\n", c);
exit(0);
}
switch(p2){
case -1:
TEST_ERROR;
exit(EXIT_FAILURE);
case 0:
read(c2[0], &c, sizeof(c));
while(c != BIG_INT_STOP){
++c;
write(c1[1], &c, sizeof(c));
read(c2[0], &c, sizeof(c));
}
close(c1[0]);
close(c1[1]);
close(c2[0]);
close(c2[1]);
printf("p2: %ld\n", c);
exit(0);
}
while(wait(&z) != -1);
}
Vielleicht, weil Sie nicht die Ergebnisse von 'write' und' read' für geschriebene Bytes und/oder Fehlercodes überprüfen? – Marian
Zwei Prozesse drucken immer ihre Nummer am Ende der Ausführung meines Programms, warum sollte es einen Fehler geben? – Lorenzo