Facebook
From mw, 3 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 55
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include "err.h"
  7.  
  8. #define NR_PROC 5
  9.  
  10. // Wersja z rekurencją
  11. void solve(int n) {
  12.     if (n == 1) {
  13.         printf("current:%d parent:%d\n", getpid(), getppid());
  14.         return;
  15.     }
  16.  
  17.     pid_t pid = fork();
  18.     if (pid == -1) {
  19.         syserr("Error in fork\n");
  20.     }
  21.     else if (pid == 0) { // jeśli jest potomkiem
  22.         solve(n-1);
  23.     }
  24.     else { // jeśli jest rodzicem
  25.         if (wait(0) == -1) { // Czeka az potomek skonczy.
  26.             syserr("Error in wait\n");
  27.         }
  28.  
  29.         printf("current:%d parent:%d\n", getpid(), getppid());
  30.     }
  31. }
  32.  
  33. int main ()
  34. {
  35. //    solve(NR_PROC);
  36.  
  37.     pid_t pid;
  38.     int i;
  39.  
  40.     /* Wersja w pętli */
  41.     for (i = 1; i <= NR_PROC; i++) {
  42.         if (i == NR_PROC) {
  43.             printf("current:%d parent:%d\n", getpid(), getppid());
  44.             return 0;
  45.         }
  46.         switch (pid = fork()) {
  47.             case -1:
  48.                 syserr("Error in fork\n");
  49.  
  50.             case 0: /* proces potomny */
  51.                 continue;
  52.  
  53.             default: /* proces macierzysty */
  54.             {
  55.                 if (wait(0) == -1) { // Czeka az potomek skonczy.
  56.                     syserr("Error in wait\n");
  57.                 }
  58.  
  59.                 printf("current:%d parent:%d\n", getpid(), getppid());
  60.                 return 0;
  61.             }
  62.         }
  63.     }
  64.  
  65.     return 0;
  66. }
  67.