C의 execvp 함수

Jinku Hu 2023년10월12일
  1. execvp 함수를 사용하여 C에서 프로세스 이미지 바꾸기
  2. execvp 함수 호출 오류 시나리오를 적절히 처리하고 해당 메시지를 출력합니다
  3. fork 함수와 함께execvp를 사용하여 자식 프로세스를 만들고 C에서 다른 프로그램을 실행합니다
C의 execvp 함수

이 기사는 C에서execvp 함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.

execvp 함수를 사용하여 C에서 프로세스 이미지 바꾸기

Unix 기반 시스템에는 새 프로세스를 만들고 실행중인 프로세스에 새 프로그램 코드를로드하기위한 두 개의 별도 시스템 호출이 있습니다. 후자는execve 시스템 호출과 다른 인터페이스 인exec 라이브러리 함수 계열을 사용하여 수행됩니다. 6 개의 서로 다른 함수 프로토 타입이 있습니다 :execlp,execle,execv,execvpexecvpe. 이 함수는 파일 이름 또는 새 프로그램 파일의 경로 이름을 사용하여로드하고 첫 번째 인수로 실행합니다. execvp는 또한 두 번째 인수로 프로그램 인수 배열을 사용합니다.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  const char *args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  execvp("vim", args);

  exit(EXIT_SUCCESS);
}

execvp 함수 호출 오류 시나리오를 적절히 처리하고 해당 메시지를 출력합니다

exec 패밀리 함수는 오류가 발생하는 경우에만 반환되므로 오류 검사 루틴을 구현하고 필요에 따라 해당 코드 경로를 처리하는 것이 중요합니다.
그중 execvp는 실패시 -1을 반환하고 errno변수도 설정합니다. 하지만 errno는 함수 호출 전에 명시 적으로 0으로 설정해야하며 지정된 호출이 반환 된 후에 만 ​​값을 확인해야합니다. execvp 함수는 슬래시없이 파일 이름을 사용할 수 있습니다. 즉,PATH 환경 변수에 지정된 디렉토리에서 파일이 검색됨을 의미합니다.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  const char *args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  errno = 0;
  if (execvp("vim", args) == -1) {
    if (errno == EACCES)
      printf("[ERROR] permission is denied for a file\n");
    else
      perror("execvp");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

fork 함수와 함께execvp를 사용하여 자식 프로세스를 만들고 C에서 다른 프로그램을 실행합니다

또는 사용자가 새 프로세스를 만들고 주어진 프로그램 코드를 실행해야한다고 가정합니다. 이 경우execvp와 결합 된fork 함수 호출을 활용할 수 있습니다. fork는 호출 프로세스를 복제하고 자식 프로세스라는 새 프로세스를 만듭니다. 다음 예제에서 우리는 새로운 프로세스를 생성하고 주어진 프로그램 코드를로드 / 실행하기 위해 커스텀 함수 래퍼를 구현했습니다. 자식 프로세스가 생성되면 다른 코드를 실행하고 부모 프로세스는 자식이 종료 될 때까지 기다립니다.

#include <errno.h>
#include <stdio.h>
#include <stdlib.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) {
    printf("spawn child with pid - %d\n", ch_pid);
    return ch_pid;
  } else {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  }
}

int main(void) {
  const char* args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("vim", args);

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

  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