Witam. Piszę program mający być rozwiązaniem problemu producenta i konsumenta z użyciem potoków nienazwanych. Niestety, na swojej drodze natrafiłem na błąd, którego nie jestem w stanie rozwiązać. Program kompiluje się, ale uruchomienie skutkuje wyświetleniem dla obu procesów błędu "Bad file descriptor". Próby doprowadziły mnie do wniosku, że problem tkwi w potoku. Szukałem rozwiązania w internecie, porównywałem sposoby użycia funkcji read() oraz write(), lecz wciąż nie wiem, co dokładnie jest nie tak. Proszę o pomoc, co robię źle, gdzie popełniłem błąd?
Poniżej kod programu:
prod.c
#include "lib.h"
int main()
{
int desk1=open("./plik1", O_RDONLY, 0644);
int buf[50];
if (desk1==-1)
{
printf("Nie da rady...\n");
exit(3);
}
//deskryptor pliku producenta
const int child_pid=fork();
//utworzenie procesu potomnego
if(pipe(fd)==-1)
{
perror("Blad funkcji pipe()\n");
exit(1);
}
switch(child_pid)
{
case -1:
perror("Blad funkcji fork(). Cos poszlo nie tak...\n");
exit(2);
break;
case 0:
//sleep(1);
execl("./kons.x", "kons.x", NULL);
perror("Blad fukcji exec().\n");
default:
close(fd[1]);
while(read(desk1, buf, 50))
{
if(write(fd[0], buf, PIPE_BUF)<0)
{
perror("Nie odczytam...\n");
exit(4);
}
}
close(fd[0]);
wait(NULL);
break;
}
return 0;
}
kons.c:
#include "lib.h"
int main()
{
char buf[50];
int desk2=open("./plik2", O_WRONLY, 0644);
if(desk2==-1)
{
perror("Nie moge otworzyc plik2...\n");
exit(6);
}
//sleep(1);
close(fd[0]);
while(read(fd[1], buf, 50))
{
if(read(buf, &desk2, 50)==-1)
{
perror("Nie moge zapisac...\n");
exit(5);
}
}
close(fd[1]);
return 0;
}
lib.h:
#ifndef LIB_H
#define LIB_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <limits.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int fd[2];
#endif