C에서 fork 함수 사용

Jinku Hu 2023년10월12일
  1. fork함수를 사용하여 C에서 새 프로세스 만들기
  2. exec함수 중 하나를 사용하여 C의 하위 프로세스에서 새 프로그램 실행
C에서 fork 함수 사용

이 기사에서는 C에서fork기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

fork함수를 사용하여 C에서 새 프로세스 만들기

fork함수는 호출자 프로세스의 중복을 나타내는 새 프로세스를 만드는 데 사용됩니다. 호출 프로세스는 일반적으로 부모 프로세스라고하며 새로 생성 된 프로세스는 자식 프로세스입니다. 위에서 하위 프로세스가 상위 프로세스의 복제본이라고 언급했지만 하위 프로세스에 고유 한 PID가있는 것과 같은 몇 가지 차이점이 있습니다. 차이점에 대한 자세한 내용은fork매뉴얼 페이지).

다음 예에서는fork를 사용하여 두 프로세스를 동시에 실행하는 간단한 시나리오를 구현합니다. 첫 번째if문은 오류 코드가 반환되었는지 확인하고fork가 성공한 경우에만 계속됩니다. 다음if문은 동시 프로세스에서 실행할 코드를 구성하는 방법을 보여줍니다.

fork호출은 성공하면 부모 프로세스와 자식에서 두 번을 반환하므로 부모의 자식 프로세스의 PID와 자식의0값을 반환하므로 다른 함수에 비해 약간 고유합니다. 프로세스에 대한 다른 코드 경로를 구별하기 위해 그에 따라 루프의 조건을 지정합니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void) {
  pid_t c_pid = fork();
  if (c_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (c_pid == 0) {
    printf("printed from child process - %d\n", getpid());
    exit(EXIT_SUCCESS);
  } else {
    printf("printed from parent process - %d\n", getpid());
    wait(NULL);
  }

  exit(EXIT_SUCCESS);
}

출력:

printed from parent process - 8485
printed from child process - 8486

exec함수 중 하나를 사용하여 C의 하위 프로세스에서 새 프로그램 실행

fork기능을 사용하는 일반적인 경우 중 하나는 하위 프로세스에서 새 프로그램을 실행하는 것입니다. 이는exec기능 중 하나를 믹스에 추가하여 수행 할 수 있습니다. 이 경우 새로운 프로세스를 생성 한 다음execvp를 호출하여 주어진 프로그램을 실행하는spawnChild라는 별도의 함수를 구현했습니다. 널리 사용 가능한 명령 줄 프로그램 인top을 선택하여 자식 프로세스에서 실행했습니다. 상위 프로세스는waitpid를 사용하여 하위 프로세스 상태 변경을 기다리도록 선택할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

pid_t spawnChild(const char* program, char** arg_list) {
  pid_t ch_pid = fork();
  if (ch_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (ch_pid == 0) {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  } else {
    printf("spawned child with pid - %d\n", ch_pid);
    return ch_pid;
  }
}

int main(void) {
  int ret;
  const char* args[] = {"top", NULL, NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("top", args);

  if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
    perror("waitpid");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

출력:

printed from child process - 8486
작가: 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