Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Szymon Bartnik grupa PSI sekja 9 */
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- int main(int argc, char *argv[]) {
- int n; // ilosc procesow potomnych
- int s; // ilosc silni do policzenia
- int inPipe[2], outPipe[2]; // potoki wejsciowy i wyjsciowy
- int pid; // identyfikator biezacego procesu
- int partResult, result; // wyniki silni
- int *childrenPids; // tablica dzieci do zabicia
- int killError = 0; // czy byl blad zabijania dzieci
- int i; // zmienna tymczasowa do iterowania etc
- if(argc < 3){
- perror("Za malo argumentow");
- exit(0);
- }
- n = atoi(argv[1]);
- s = atoi(argv[2]);
- printf("Wejscie: %i procesy, %i silnie\n", n, s);
- printf("Alokacja tablicy na identyfikatory procesow\n");
- childrenPids = (int*)malloc(n*sizeof(int));
- if(pipe(inPipe) < 0){
- perror("Blad przy tworzeniu potoku wejsciowego");
- exit(1);
- }
- if(pipe(outPipe) < 0){
- perror("Blad przy tworzeniu potoku wyjsciowego");
- exit(1);
- }
- // spawnowanie dzieci
- printf("Spawnowanie dzieci\n");
- for(i = 0; i<n; i++){
- if(((pid = fork()) < 0)){
- perror("Blad forkowania");
- exit(1);
- }
- if(pid == 0){
- // jestesmy w procesie dziecka
- printf("Stworzono dziecko\n");
- while(1){
- read(inPipe[0], &i, sizeof(i));
- i = calculateFactorial(i);
- write(outPipe[1], &i, sizeof(i));
- printf("Obliczono i odeslano wynik %i! w watku potomnym\n", i);
- }
- } else childrenPids[i] = pid; // jestesmy w procesie rodzica
- }
- // wysylanie danych do obliczen
- printf("Wysylanie danych do obliczen\n");
- for(i=1; i<=s; ++i){
- write(inPipe[1], &i, sizeof(i));
- printf("Wyslano %i! do obliczen\n", i);
- }
- // odbieranie danych obliczonych
- printf("Odbieranie wynikow\n");
- for(i=1; i<=s; i++){
- read(outPipe[0], &partResult, sizeof(partResult));
- result += partResult;
- printf("Wynik czastkowy (%i!): %i\n", i, partResult);
- }
- // zabijanie zdieci
- printf("Zabijanie dzieci\n");
- for(i = 0; i<n; i++){
- if(kill(childrenPids[i], SIGTERM) != 0){
- perror("Problem z zabiciem jednego z dzieci\n");
- killError = 1;
- }
- }
- if(killError == 1) exit(1);
- printf("Pelny wynik (zsumowane silnie): %i\n", result);
- return 0;
- }
- int calculateFactorial(int num){
- if(num == 1) return 1;
- return num * calculateFactorial(num-1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement