Witam.
Potrzebuję pomocy z jednym zadaniem kompilowanym gcc na linuxie.
Jego treść to:
"Utworzyć parę procesów producent-konsument.Procesy komunikują się ze sobą za pomocą potoku (pipe'a). Protokół komunikacji jest następujący: konsument wysyła sygnał INT do procesu producenta, po czym odczytuje pipe'a, a następnie wypisuje jego zawartość na stdout; producent po otrzymaniu sygnału INT czyta (kolejny) wiersz z pliku tekstowego i wysyła go poprzez pipe do konsumenta. Powyższy cykl komunikacji powtarza się aż do ostatniego wiersza pliku lub do napotkania wiersza "nazwisko" (zawierający nazwisko autora programu). Procesy producenta i konsumenta powoływane się z jednego procesu macierzystego za pomocą funkcji fork()."
Korzystałem troszki z zadania, które omawiane było na zajęciach, jednak dalej mam problem. Program się kompiluje, uruchamia, ale nie działa. Czy ktoś jest w stanie to ogarnąć?
Oto kod:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define ROZM 10
void Wypisz(char *str)
{
write (STDOUT_FILENO, str, strlen(str));
}
int main()
{
int f;
char line[ROZM];
int do_potomka[2];
int do_rodzica[2];
// char line [ 128 ];
if(pipe(do_potomka) < 0) return(1);
if(pipe(do_rodzica) < 0) return(1);
if((f=fork())==0)
//klient
{
close(do_potomka[1]); // zamkniety do pisania, tylko odczyt z [0]
close(do_rodzica[0]); // zamkniety do czytania, tylko zapis do [1]
static const char stopword[] = "_nercz_";
static const char filename[] = "file.txt";
FILE *file = fopen ( filename, "r" );
if ( file != NULL )
{
char line [ 128 ];
int num_in;
while ( fgets ( line, sizeof line, file ) != NULL )
{
if(line == stopword) {
Wypisz("stopword!");
break;
}
// num_in = atoi(line);
write(do_rodzica[1],line,ROZM);
}
fclose ( file );
}
else
{
perror ( filename );
}
}
//serwer
close(do_rodzica[1]); //zamkniety do pisania
close(do_potomka[0]); //zamkniety do czytania
//read(do_rodzica[0],line,ROZM);
// liczba1 = atoi(line);
//read(do_rodzica[0],line,ROZM);
//liczba2 = atoi(line);
//suma = liczba1 + liczba2;
//sprintf(line,"%d",suma);
write(do_potomka[1],line,ROZM);
waitpid(f, 0, NULL);
return 0;
}