Komunikcja miedzy procesorowa, unix

Komunikcja miedzy procesorowa, unix
AK
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:3
0

Hej
Mam do napisanie program w C, który będzie osułgiwał procesy w następujący sposób. Proces macierzysty ma pobrac dane od użytkowanika w nieskończonej pętli, 1 proces potomny ma przetworzyć te dane(silnia), 2 proces potomny ma wyświetlić dane. Proces macierzyty z procesem 1 komunikują się za pomocą pipe. Proces 1 i 2 za pomocą FIFO. Pierwszą pętlę program robi mi poprawnie. W kolejnych wygląda to jakby FIFO nie działało poprawnie (screen).
Przykład poprawnego działania:
"Podaj liczbę:"
5
"Otrzymałem 120"
"Podaj liczbę:"
3
"Otrzymałem: 6"
Kod programu:

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#define FIFO "fifoFile"
#define WRITE 1
#define READ 0
FILE * des;
FILE *fp;
int silnia(int n){
	int s=1;
	int i;
	for(i=1; i<=n; i++){
		s=s*i;
	}
	return s;
}

char* itoa(int val, int base){
	
	static char buf[256] = {0};
	umask(0);
    mkfifo(FIFO, 0666);
	int i = 30;
	
	for(; val && i ; --i, val /= base)
	
		buf[i] = "0123456789abcdef"[val % base];
	
	return &buf[i+1];
	
}

int main(){
	int pdes[2];
	int counter = 0;
	char string[256];
	char* string1;
	pipe(pdes);
	char bufor[ 256 ];
	if(fork()){
		printf("Proces pierwszy (PID: %d). Rozpoczynam pisanie...\n", getpid()); //proces potomny
		close(pdes[WRITE]);
		FILE *fp;
		while(1){
			read(pdes[READ], string, sizeof(string));
			//printf("Liczba przesłana\n");
			printf("%s\n", string);
			int liczba;
			liczba = atoi(string);
			//printf ("Liczba w int: %d\n", liczba);
			int s = silnia(liczba);
			//printf("Silnia = %d\n", s);
			string1 = itoa(s, 10);
			//printf("%s\n", string1);
			fp = fopen(FIFO, "w");
			fputs(string1, fp);
			fclose(fp);
			sleep(1);
		}
	}
	else if(fork()){
		char s[256];
		fp = fopen(FIFO, "r");
		fgets(s, 256, fp);
		fclose(fp);
		printf("Otrzymalem: %s\n\n", s);
		printf("Czy zapisać do pliku?\n 1- TAK, 2- NIE\n");
		int a;
		scanf("%d", &a);
		if (a==1){
			des = fopen( "wyniki", "w+");
				if( des < 0 ){
					write( 2, "Error!\n", 7 );
					return 1;
				}
				else
					fprintf(des,"%s\n", s);
			fclose(des);
		}
	}
	else{ //proces macierzysty
		printf("Proces macierzysty: %d", getpid());
		close(pdes[READ]);
		while(1){
			sleep(2);
			printf("Podaj liczbe\n");
			scanf("%s", string);
			write(pdes[WRITE], string, sizeof(string));
		}
	}
	return 0;
}

screenshot-20191228191224.png

BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 7 godzin
  • Postów:289
0

Ja wiem, że tego typu kod jest w manualu do fork(), ale to tylko przykład użycia funkcji... Ułatw sobie życie i podziel to na funkcje, np. tak:

Kopiuj
int main()
{
   pidt_t pid1;
  
   pid1=fork();
   if ( pid1 == -1 ) 
   {
       perror("...");
       exit(1);
    } 
    else if (pid1 == 0)
    {
        function_for_child1(...);
        exit(0);
    }
    // tu jesteśmy nadal w procesie głównym i mamy praktycznie PEWNOŚĆ, że "dziecko" do tego miejsca w żaden sposób nie dotrze
   
   return 0;
}

W Twojej wersji ciężko jest dojść do tego który proces wykona dane rozgałęzienie if-ów.

edytowany 1x, ostatnio: Bartłomiej Golenko

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.