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:
#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-20191228191207.png (238 KB) - ściągnięć: 62
- screenshot-20191228190854.png (239 KB) - ściągnięć: 44
- screenshot-20191228191224.png (134 KB) - ściągnięć: 51