cblc/aulas/08-processos/fork-exec.c
2025-04-01 09:41:17 -03:00

47 lines
1.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
// Chamada fork...
pid_t pid = fork();
// Se o fork falhar...
if (pid < 0) {
perror("fork falhou");
exit(EXIT_FAILURE);
}
/*
Um segundo processo é criado e o código seguinte será executado
por ambos os processos (eles são idênticos!), mas com valores
de pid diferentes:
- Para o processo filho, pid == 0
- Para o processo pai, pid == PID do processo filho
Por isso temos essa estrutura if...
*/
if (pid == 0) {
// Processo filho...
printf("[Filho] PID: %d, iniciado.\n", getpid());
char *args[] = {"ls", "-l", NULL};
// Chamada exec (execvp)...
execvp(args[0], args);
// Se execvp falhar...
perror("execvp falhou");
exit(EXIT_FAILURE);
} else {
// Processo pai...
printf("[Pai] PID: %d, criou filho PID: %d\n", getpid(), pid);
printf("[Pai] Aguardando término do filho...\n");
int status;
waitpid(pid, &status, 0);
printf("[Pai] Processo filho %d terminou com status %d\n", pid, WEXITSTATUS(status));
printf("[Pai] Voltando ao controle.\n");
}
return 0;
}