/** * ============================================================================ * PHM Open Source — Sistemas Operacionais & Concorrência * Algoritmo 04: Hierarquia de Processos com fork(), exec() e wait() (POSIX) * Autor: Prof. Paulo Henrique Maciel · PHM Tech * ============================================================================ * * CONCEITO TEÓRICO DE S.O.: * No Unix/Linux, todo novo processo é gerado através da chamada de sistema fork(). * O fork() duplica o processo pai, criando um processo filho com espaço de * memória isolado. * * VALORES DE RETORNO DO fork(): * - Retorna < 0 : Erro ao tentar criar o processo filho. * - Retorna == 0: Estamos executando no contexto do PROCESSO FILHO. * - Retorna > 0 : Estamos no PROCESSO PAI (o valor retornado é o PID do filho). * * COMO COMPILAR E EXECUTAR (Ambiente POSIX/Linux/Mac/WSL): * gcc 04_criacao_processos_fork.c -o so_fork && ./so_fork * ============================================================================ */ #include #include #if defined(_WIN32) // Nota explicativa para alunos em ambiente Windows nativo int main(void) { printf("====================================================\n"); printf(" PHM TECH — S.O. · HIERARQUIA DE PROCESSOS (FORK) \n"); printf("====================================================\n\n"); printf("[NOTA DIDATICA SOBRE ARQUITETURA DE SISTEMAS]\n"); printf("A chamada de sistema 'fork()' e exclusiva do padrao POSIX (Linux/Unix/Mac/WSL).\n"); printf("No Windows, a criacao de processos utiliza a API 'CreateProcess()'.\n"); printf("Para compilar este exemplo nativamente, utilize o WSL (Windows Subsystem for Linux),\n"); printf("uma maquina virtual Linux ou sistema operacional Unix-like.\n"); return 0; } #else #include #include #include int main(void) { printf("====================================================\n"); printf(" PHM TECH — S.O. · HIERARQUIA DE PROCESSOS (FORK) \n"); printf("====================================================\n\n"); pid_t pidPai = getpid(); printf("[PROCESSO INICIAL] PID: %d esta executando...\n\n", pidPai); // Chamada de sistema que duplica o processo pid_t pidFilho = fork(); if (pidFilho < 0) { perror("[ERRO] Falha ao executar chamada fork()"); exit(1); } else if (pidFilho == 0) { // --- CONTEXTO DO PROCESSO FILHO --- printf(" [PROCESSO FILHO CRIADO]\n"); printf(" -> Meu PID Proprio : %d\n", getpid()); printf(" -> PID do Meu Pai : %d\n", getppid()); printf(" -> Realizando tarefa isolada em background...\n"); sleep(2); // Simula trabalho do filho printf(" -> Processo filho finalizou seu trabalho com status 0!\n\n"); exit(0); } else { // --- CONTEXTO DO PROCESSO PAI --- printf("[PROCESSO PAI]\n"); printf(" -> Criei com sucesso o processo filho com PID: %d\n", pidFilho); printf(" -> Aguardando o filho terminar via chamada de sistema wait()...\n"); int status; waitpid(pidFilho, &status, 0); // Bloqueia o pai ate o filho terminar if (WIFEXITED(status)) { printf("[PROCESSO PAI] O filho (PID %d) terminou normalmente com codigo de saida: %d.\n", pidFilho, WEXITSTATUS(status)); } } return 0; } #endif