Вы делаете pere write
в и pere и fil вместо только в pere.
Ваш второй вызов по каналу - pipe(tubefils[p])
, но он должно быть pipe(tubefils[k])
Вы должны сделать wait
в конце pere.
И вы должны закрыть конец записи канала в родительском объекте после выполнения записи.
И после чтения вы должны закрыть конец канала в дочернем элементе.
Вот некоторый исправленный код:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/wait.h>
int
main(void)
{
const int p = 4;
const int n = 500;
int k, i, j;
int premier;
pid_t pid;
pid_t fils[p];
int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];
pipe(tubePere);
for (k = 0; k < p; k++) {
#if 0
pipe(tubeFils[p]);
#else
pipe(tubeFils[k]);
#endif
pid = fork();
fils[k] = pid;
if (pid < 0) {
printf("Error\n");
exit(1);
}
// pere ...
if (pid != 0) {
intervals1[0] = k * n / p + 1;
intervals1[1] = (k + 1) * n / p;
printf("intervals1 : %d .. %d\n", intervals1[0], intervals1[1]);
close(tubeFils[k][0]);
write(tubeFils[k][1], intervals1, sizeof(intervals1));
close(tubeFils[k][0]);
continue;
}
// fils ...
close(tubeFils[k][1]);
read(tubeFils[k][0], intervals2, sizeof(intervals2));
close(tubeFils[k][0]);
printf("intervals2 : %d .. %d\n", intervals2[0], intervals2[1]);
for (i = intervals1[0]; i <= intervals2[1]; i++) {
if (i == 1)
premier = 0;
else if (i == 2)
premier = 1;
else {
j = 2;
premier = 1;
while ((j <= sqrt(i)) && (premier == 1)) {
if ((i % j) == 0)
premier = 0;
j++;
}
}
if (premier == 1) {
// printf("%d ",i);
}
}
exit(0);
}
while (1) {
pid = wait(NULL);
if (pid <= 0)
break;
}
return 0;
}
Вот исправленный вывод:
intervals2 : 1 .. 125
intervals1 : 1 .. 125
intervals2 : 126 .. 250
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 251 .. 375
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500