Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "unistd.h"
- #include "wait.h"
- #include "stdlib.h"
- int pipe1[2];
- int pipe2[2];
- void proces2();
- void proces3();
- long factorial(int n)
- {
- unsigned long fact = 1;
- int i;
- for (i = 1; i <= n; i++)
- fact = fact * i;
- return fact;
- }
- int main() {
- if(pipe(pipe1) == -1) {
- perror("Nie udało się utworzyć pipe do komunikacji procesa macierzystego z potomkiem liczacym silnie");
- }
- if(pipe(pipe2) == -1) {
- perror("Nie udało się utworzyć pipe do komunikacji potomkow");
- }
- int rc = fork();
- if(rc == 0) {
- proces2();
- exit(0);
- }
- rc = fork();
- if(rc == 0) {
- proces3();
- exit(0);
- }
- close(pipe1[0]);
- int odczytanaWartosc = -1;
- while(1) {
- scanf("%d", &odczytanaWartosc);
- fflush(stdout);
- rc = write(pipe1[1], (char*)&odczytanaWartosc, sizeof(int));
- if(rc < 0) {
- perror("Nie moge zapisac do pipe");
- exit(1);
- }
- if(odczytanaWartosc < 0)
- break;
- }
- wait(0);
- wait(0);
- printf("Wszystkie procesy zakończyły pracę\n");
- fflush(stdout);
- }
- void proces2() {
- close(pipe1[1]);
- close(pipe2[0]);
- int odebranaWartosc = -1;
- long fact = 0;
- while (1)
- {
- int rc = read(pipe1[0], (char *)&odebranaWartosc, sizeof(int));
- if(rc < 0) {
- perror("Nie moge odczytac z pipe");
- exit(1);
- }
- fact = factorial(odebranaWartosc);
- if(odebranaWartosc < 0) {
- fact = -1;
- }
- rc = write(pipe2[1], (char*)&fact, sizeof(long));
- if(rc < 0) {
- perror("Nie moge zapisac do pipe");
- exit(1);
- }
- if(odebranaWartosc < 0)
- break;
- }
- close(pipe1[1]);
- }
- void proces3() {
- close(pipe2[1]);
- long odebranaWartosc = -1;
- while( 1 )
- {
- int rc = read(pipe2[0], (char *)&odebranaWartosc, sizeof(long));
- if(rc < 0) {
- perror("Nie moge odczytac z pipe");
- exit(1);
- }
- if(odebranaWartosc < 0)
- break;
- printf("%ld\n", odebranaWartosc);
- fflush(stdout);
- }
- close(pipe2[0]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement