Função wait em C
-
Use a função
wait
para aguardar a mudança de estado em processos filho em C -
Use a função
waitpid
para aguardar a mudança de estado em processo filho específico em C
Este artigo demonstrará vários métodos sobre como usar a função wait
em C.
Use a função wait
para aguardar a mudança de estado em processos filho em C
A função wait
é um wrapper para chamada de sistema compatível com POSIX, definida no arquivo de cabeçalho <sys/wait.h>
. A função é usada para esperar por mudanças de estado do programa em processos filhos e recuperar as informações correspondentes. wait
é normalmente chamado após a chamada de sistema fork
que cria um novo processo filho. A chamada wait
suspende o programa de chamada até que um de seus processos filho seja encerrado.
O usuário deve estruturar o código de forma que haja dois caminhos diferentes para um processo de chamada e o processo filho. Geralmente é realizado com a instrução if...else
que avalia o valor de retorno da chamada da função fork
. Observe que fork
retorna o ID do processo filho, um inteiro positivo, no processo pai e retorna 0 no processo filho. fork
retornará -1 se a chamada falhar.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t c_pid = fork();
if (c_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (c_pid == 0) {
printf("printed from child process %d", getpid());
exit(EXIT_SUCCESS);
} else {
printf("printed from parent process %d\n", getpid());
wait(NULL);
}
exit(EXIT_SUCCESS);
}
Use a função waitpid
para aguardar a mudança de estado em processo filho específico em C
waitpid
é uma versão ligeiramente aprimorada da função wait
que fornece o recurso de esperar pelo processo filho específico e modificar o comportamento de acionamento de retorno. waitpid
pode retornar se o processo filho foi interrompido ou continuado adicionalmente ao caso em que o filho é encerrado.
No exemplo a seguir, chamamos a função pause
do processo filho, que vai hibernar até que o sinal seja recebido. Por outro lado, o processo pai chama a função waitpid
e suspende a execução até que o filho retorne. Ele também usa as macros WIFEXITED
e WIFSIGNALED
para verificar se a criança é encerrada normalmente ou encerrada pelo sinal, respectivamente, e depois imprime a mensagem de status correspondente no console.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t child_pid, wtr;
int wstatus;
child_pid = fork();
if (child_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
printf("Child PID is %d\n", getpid());
pause();
_exit(EXIT_FAILURE);
} else {
wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
if (wtr == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(wstatus)) {
printf("exited, status=%d\n", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
printf("killed by signal %d\n", WTERMSIG(wstatus));
}
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook