Advertisement
paulogp

Gestão de processos fork (v 1.0.0)

Jul 13th, 2011
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.69 KB | None | 0 0
  1. /* Funções básicas relacionadas com a criação e gestão de processos (fork(), wait()) */
  2. // Apple Xcode
  3.  
  4.  
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/wait.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11.  
  12. void func_simula_processamento();
  13.  
  14. int main (int argc, const char * argv[])
  15. {
  16.     int the_fork, the_status;
  17.  
  18.     // function shall create a new process
  19.     // the new process (child process) shall be an exact copy of the
  20.     // calling process (parent process)
  21.     the_fork = fork();
  22.  
  23.     // getppid: shall return the parent process ID of the calling process
  24.     printf("pid = %d, ppid = %d\n", getpid(), getppid());
  25.  
  26.     // waits for seconds or until a signal is delivered, whichever happens first
  27.     sleep(1);
  28.  
  29.     // seed random number generator
  30.     // 'srandom' call only needs to be done once per program
  31.     srandom(getpid());
  32.  
  33.     int the_fork_test_var = 3;
  34.  
  35.     // the_fork == 0: == "filho": termina no exit(1)
  36.     // apenas o filho realiza esta accao
  37.     // as variaveis dentro deste filho nao afectam o pai ou outros filhos  
  38.     if (the_fork == 0)
  39.     {
  40.         // demonstra que a var alterada pelo filho nao afecta o pai
  41.         the_fork_test_var = 7;
  42.         printf("filho: %i\n", the_fork_test_var);
  43.  
  44.         // simula processamento
  45.         for (int i = 0; i < 20; ++i)
  46.         {
  47.             func_simula_processamento();
  48.             printf("<%d ", i);
  49.  
  50.             // flush a stream: forca saida dos valores
  51.             fflush(stdout);
  52.         }
  53.  
  54.         // a accao do filho termina aqui
  55.         // o filho morre neste ponto
  56.         exit(1);
  57.     }
  58.  
  59.     // demonstra que a var alterada pelo filho nao afecta o pai
  60.     printf("pai: %i\n", the_fork_test_var);
  61.  
  62.     // apenas pai realiza esta accao. neste caso, por causa do exit(1) do filho
  63.     for (int i = 20; i < 40; ++i)
  64.     {
  65.         func_simula_processamento();
  66.         printf(">%d ", i);
  67.  
  68.         // flush a stream: forca saida dos valores
  69.         fflush(stdout);
  70.     }
  71.  
  72.     // wait(): this function blocks the calling process until one of its
  73.     // child processes exits or a signal is received
  74.     // wait(): takes the address of an integer variable and returns the
  75.     // process ID of the completed process
  76.     the_fork = wait(&the_status);
  77.  
  78.     printf("\n");
  79.  
  80.     // WIFEXITED: this macro queries the child termination status provided
  81.     // by the wait and waitpid functions, and determines whether the child
  82.     // process ended normally
  83.     if (WIFEXITED(the_status))
  84.     {
  85.         printf("valor de retorno de (%d): %d\n", the_fork, WEXITSTATUS(the_status));
  86.     }
  87.     else
  88.     {
  89.         printf("filho (%d) terminou de forma anormal\n", the_fork);
  90.     }
  91.  
  92.     return 0;
  93. }
  94.  
  95.  
  96. #define NELEM 64
  97.  
  98. void func_simula_processamento()
  99. {
  100.     // random stuff
  101.     double d1[NELEM];
  102.  
  103.     for (int i = 0; i < random(); ++i)
  104.     {
  105.         for (int j = 0; j < NELEM; ++j)
  106.         {
  107.             d1[j] = d1[j] * 1.1;
  108.         }
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement