Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Funções básicas relacionadas com a criação e gestão de processos (fork(), wait()) */
- // Apple Xcode
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <time.h>
- void func_simula_processamento();
- int main (int argc, const char * argv[])
- {
- int the_fork, the_status;
- // function shall create a new process
- // the new process (child process) shall be an exact copy of the
- // calling process (parent process)
- the_fork = fork();
- // getppid: shall return the parent process ID of the calling process
- printf("pid = %d, ppid = %d\n", getpid(), getppid());
- // waits for seconds or until a signal is delivered, whichever happens first
- sleep(1);
- // seed random number generator
- // 'srandom' call only needs to be done once per program
- srandom(getpid());
- int the_fork_test_var = 3;
- // the_fork == 0: == "filho": termina no exit(1)
- // apenas o filho realiza esta accao
- // as variaveis dentro deste filho nao afectam o pai ou outros filhos
- if (the_fork == 0)
- {
- // demonstra que a var alterada pelo filho nao afecta o pai
- the_fork_test_var = 7;
- printf("filho: %i\n", the_fork_test_var);
- // simula processamento
- for (int i = 0; i < 20; ++i)
- {
- func_simula_processamento();
- printf("<%d ", i);
- // flush a stream: forca saida dos valores
- fflush(stdout);
- }
- // a accao do filho termina aqui
- // o filho morre neste ponto
- exit(1);
- }
- // demonstra que a var alterada pelo filho nao afecta o pai
- printf("pai: %i\n", the_fork_test_var);
- // apenas pai realiza esta accao. neste caso, por causa do exit(1) do filho
- for (int i = 20; i < 40; ++i)
- {
- func_simula_processamento();
- printf(">%d ", i);
- // flush a stream: forca saida dos valores
- fflush(stdout);
- }
- // wait(): this function blocks the calling process until one of its
- // child processes exits or a signal is received
- // wait(): takes the address of an integer variable and returns the
- // process ID of the completed process
- the_fork = wait(&the_status);
- printf("\n");
- // WIFEXITED: this macro queries the child termination status provided
- // by the wait and waitpid functions, and determines whether the child
- // process ended normally
- if (WIFEXITED(the_status))
- {
- printf("valor de retorno de (%d): %d\n", the_fork, WEXITSTATUS(the_status));
- }
- else
- {
- printf("filho (%d) terminou de forma anormal\n", the_fork);
- }
- return 0;
- }
- #define NELEM 64
- void func_simula_processamento()
- {
- // random stuff
- double d1[NELEM];
- for (int i = 0; i < random(); ++i)
- {
- for (int j = 0; j < NELEM; ++j)
- {
- d1[j] = d1[j] * 1.1;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement