Помимо ошибок с использованием правильного адреса и размера данных, которые вы хотите прочитать, основная ошибка заключается в том, что вы не должны повторно открывать и закрывать FIFO в цикле.
Открытие FIFO для чтения или записибудет блокироваться, пока другой конец также не будет открыт. Таким образом, и prog1, и prog2 будут ждать, пока prog3 не откроет FIFO для чтения, а prog3 будет ждать, пока хотя бы один из prog1 и prog2 откроет FIFO для записи.
Закрытие FIFO на конце записи вызовет EOFсостояние на конце чтения. Закрытие FIFO на конце чтения приведет к ошибке «сломанный канал» на конце записи.
В программах также отсутствует обработка ошибок. mkfifo
, open
, read
, write
, close
могут возвращать ошибку, read
и write
также могут возвращать число байтов меньше, чем вы хотели прочитать или записать. Вероятно, этого не произойдет с вашим небольшим объемом данных в вашем примере, но вы, скорее всего, заметите это, когда попытаетесь передать большие объемы данных.
Вот улучшенные версии ваших программ:
prog1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog1(char *fifo)
{
int descriptor;
int a=0;
int i=0;
descriptor = open(fifo, O_WRONLY);
while (i!=10)
{
a+=2;
write(descriptor,&a, sizeof(a));
printf("Even number %d : %d\n", i, a);
i++;
}
close(descriptor);
}
int main(void)
{
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog1(fifo);
return 0;
}
prog2
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog2(char *fifo)
{
int descriptor;
int b=1;
int i=0;
descriptor = open(fifo, O_WRONLY);
while (i!=10)
{
write(descriptor, &b, sizeof(b));
printf("Odd number %d: %d\n", i, b);
b+=2;
i++;
}
close(descriptor);
}
int main(void)
{
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog2(fifo);
return 0;
}
prog3
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog3(char *fifo)
{
int descriptor;
int a;
int b;
int i=0;
descriptor = open(fifo, O_RDONLY);
while (i!=10)
{
read(descriptor,&a, sizeof(a));
read(descriptor,&b, sizeof(b));
printf("Sum %d: %d + %d = %d\n", i, a, b, a+b);
i++;
}
close(descriptor);
}
int main(void)
{
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog3(fifo);
return 0;
}
При запуске программ я получаю (различные) выходные данные:
$ ./prog1&./prog2&
[1] 8410
[2] 8411
$ ./prog3
Sum 0: 1 + 2 = 3
Odd number 0: 1
Even number 0 : 2
Odd number 1: 3
Sum 1: 3 + 4 = 7
Even number 1 : 4
Odd number 2: 5
Sum 2: 5 + 6 = 11
Odd number 3: 7
Even number 2 : 6
Odd number 4: 9
Even number 3 : 8
Sum 3: 7 + 9 = 16
Odd number 5: 11
Even number 4 : 10
Odd number 6: 13
Sum 4: 8 + 11 = 19
Even number 5 : 12
Odd number 7: 15
Sum 5: 10 + 13 = 23
Even number 6 : 14
Odd number 8: 17
Sum 6: 12 + 15 = 27
Odd number 9: 19
Even number 7 : 16
Sum 7: 14 + 17 = 31
Even number 8 : 18
Sum 8: 16 + 19 = 35
Even number 9 : 20
Sum 9: 18 + 20 = 38
[2] + 8411 done ./prog2
[1] + 8410 done ./prog1