C의 대기 기능

Jinku Hu 2023년10월12일
  1. wait 함수를 사용하여 C의 하위 프로세스에서 상태 변경을 기다립니다
  2. waitpid 함수를 사용하여 C의 특정 하위 프로세스에서 상태 변경을 기다립니다
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 함수를 호출하고 자식이 돌아올 때까지 실행을 중단합니다. 또한WIFEXITEDWIFSIGNALED 매크로를 사용하여 자식이 정상적으로 종료되었는지 신호에 의해 종료되었는지 확인한 다음 해당 상태 메시지를 콘솔에 출력합니다.

#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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C Process