C의 대기 기능
이 기사는 C에서wait
함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.
wait
함수를 사용하여 C의 하위 프로세스에서 상태 변경을 기다립니다
wait
함수는<sys/wait.h>
헤더 파일에 정의 된 POSIX 호환 시스템 호출을위한 래퍼입니다. 이 함수는 자식 프로세스의 프로그램 상태 변경을 기다리고 해당 정보를 검색하는 데 사용됩니다. wait
는 일반적으로 새 자식 프로세스를 생성하는fork
시스템 호출 후에 호출됩니다. wait
호출은 하위 프로세스 중 하나가 종료 될 때까지 호출 프로그램을 일시 중단합니다.
사용자는 호출 프로세스와 하위 프로세스에 대해 두 가지 다른 경로가 있도록 코드를 구성해야합니다. 일반적으로 fork
함수 호출의 반환 값을 평가하는 if...else
문으로 수행됩니다. fork
는 상위 프로세스에서 양의 정수인 하위 프로세스 ID를 반환하고 하위 프로세스에서 0을 반환합니다. fork
는 호출이 실패하면 -1을 반환합니다.
#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);
}
waitpid
함수를 사용하여 C의 특정 하위 프로세스에서 상태 변경을 기다립니다
waitpid
는 특정 하위 프로세스를 기다렸다가 반환 트리거 동작을 수정하는 기능을 제공하는wait
함수의 약간 향상된 버전입니다. waitpid
는 자식 프로세스가 중지되었거나 자식이 종료 된 경우에 추가로 계속되면 반환 할 수 있습니다.
다음 예제에서는 신호가 수신 될 때까지 절전 모드로 전환되는 자식 프로세스에서 pause
함수를 호출합니다. 반면에 부모 프로세스는waitpid
함수를 호출하고 자식이 돌아올 때까지 실행을 중단합니다. 또한WIFEXITED
와WIFSIGNALED
매크로를 사용하여 자식이 정상적으로 종료되었는지 신호에 의해 종료되었는지 확인한 다음 해당 상태 메시지를 콘솔에 출력합니다.
#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