Potoki nazwane dla niezaleznych procesów – funkcja mkfifo

0

Cześć mam problem z programem
Mam za zadanie utworzy potok za pomoca funkcji mkfifo z lini komend, a nastepnie z innego terminalu uruchomic niezalezne procesy producent i konsumenta, producent dostarcza informacje do potoku a konsument je odbiera. Problem polega na tym, że po uruchomieniu procesu Producent i Konsumenta zupelnie nic sie nie dzieje.

  1. Tworze potok mkfifo potok
  2. Uruchamiam program Producenta z innego terminalu jego kod(nazwe potoku przyjmuje rowniez z lini komend) :
int main ( int argc , const char *argv[])
{
if( argc == 2 )
{
producent(argv[1]);
}

else
printf("Nie poprawna ilość argumentów. Prawidłowy sposob ./nazwaprogramy potok   , gdzie potok  - to nazwa potoku utworzonego za pomoca funkcji mkfifo");
}

Ciało producent

void producent(const char *d)
{
	char *buf; // wskaźnik do odczytu 
	FILE *fin; // wskaznik do pliku 
	buf = malloc(100); // alokujemy pamiec dla danych 
	fin = fopen ("magazyn.txt" , "r"); // Otwieramy plik magazyn.txt w trybie czytania z niego
	int fin2 = open( d , O_WRONLY);
	time_t tt; // konieczny do rand
	 
           do 
	    {
	       if(fgets(buf , 100 , fin )== NULL) // Funckja fgets pobiera dane z pliku zapisuje je do tablicy buf 
		  {
		    printf("plik sie skonczył\n");
		    exit(1);
		  }
	    
		

		printf("Producent %s " , buf) ; // Odpowiedni komunikat, oraz zawartosc 

		 if( write( fin2 , buf , 100 ) == -1)
		    {
			perror("Funckja write zwrocila blad ");
			exit(2);
		    }
		
			sleep(1);// Czekamy na proces potomny
			
	    }while( fin != NULL);
		fclose(fin);
		close(fin2);
		
}

Po uruchomieniu programu producent zupełni nic sie nie dzieje, tak jakby proces był zapauzowany , kompilator nie zwraca błędu. Co jest nie tak ?

0

Nazwa programu jest przekazywana jako pierwszy argument tak więc przekazując w linii komend nazwy dwóch potoków argc będzie wynosić 3

1

Program blokuje się podczas otwierania kolejki:

int fin2 = open( d , O_WRONLY);

Jest to naturalne zachowanie kolejki fifo -sugeruje się tym linkiem
Na szybko zrobiłem konsumenta i wydaje mi się, że komunikacja przebiega tak jak powinna tj.

  1. Tworze plik magazyn.txt z przykładową zawartoscia
  2. Tworze kolejke fifo
  3. Po uruchomieniu producenta program blokuje się na otwarciu kolejki
  4. Uruchamiam konsumenta, który otwiera kolejke i otrzymuje wiadomosc ktorą producent pobrał z pliku magazyn.txt
// producent.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

void producent(const char *d);

int main ( int argc , const char *argv[])
{
    
	if( argc == 2 )
		producent(argv[1]);
	else
		printf("Nie poprawna ilość argumentów. Prawidłowy sposob ./nazwaprogramy potok  potok2 , gdzie potok i potok2 - to 	nazwa potoku utworzonego za pomoca funkcji mkfifo");

    return 0;
}

void producent(const char *d)
{

    char *buf; // wskaźnik do odczytu 
    FILE *fin; // wskaznik do pliku 
    buf = malloc(100); // alokujemy pamiec dla danych 

    fin = fopen ("magazyn.txt" , "r"); // Otwieramy plik magazyn.txt w trybie czytania z niego

    int fin2 = open( d , O_WRONLY);
    printf("otworzono kolejke\n");
    time_t tt; // konieczny do rand
 
    
        do 
        {
           if(fgets(buf , 100 , fin )== NULL) // Funckja fgets pobiera dane z pliku zapisuje je do tablicy buf 
          {
            printf("plik sie skonczył\n");
            exit(1);
          }
 
        printf("Producent: %s " , buf) ; // Odpowiedni komunikat, oraz zawartosc 
 
         if( write( fin2 , buf , 100 ) == -1)
            {
            perror("Funckja write zwrocila blad ");
            exit(2);
            }
 
            sleep(1);// Czekamy na proces potomny
 
        }while( fin != NULL);
        fclose(fin);
        close(fin2);
}
// konsument.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>


#define BUFSIZE 100

void konsument(const char *d);

int main ( int argc , const char *argv[])
{
    
	if( argc == 2 )
		konsument(argv[1]);
	else
		printf("...");

    return 0;
}

void konsument(const char *d)
{
	char buff[BUFSIZE];
	int fin = open( d , O_RDONLY);
	read(fin, buff, BUFSIZE);
	printf("%s\n", buff);
	close(fin);
}

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