Pipe'y w C

0

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;
}

0

Jest w stanie, ale na "dzień dobry" (a raczej "dobry wieczór") pytania pomocnicze: czemu piszesz po ekranie używając write zamiast printf/puts? Gdzie masz obsługę sygnałów?

0

Tak jak wspomniałem, posiłkowałem się zadaniem pokazowym, gdzie był właśnie write. Obsługi sygnałów chyba brak.

0

yyy... ten kod jest bez sensu.

  1. popraw formatowanie ! http://format.krzaq.cc/

  2. proces dziecka jest konczony zaraz po forku, czy tego wlasnie chcesz? Nie sadze...
    fork zwraca 0 lub pid, Ty dla zera wchodzisz w jakas tam petle, ale dla pid konczysz proces....

 
#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;
}

0

Dodatkowo, nie potrzebujesz 2 par pipow, wystarczy Ci jedna ;)
Polecam: http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1