C의 execvp 함수
-
execvp
함수를 사용하여 C에서 프로세스 이미지 바꾸기 -
execvp
함수 호출 오류 시나리오를 적절히 처리하고 해당 메시지를 출력합니다 -
fork
함수와 함께execvp
를 사용하여 자식 프로세스를 만들고 C에서 다른 프로그램을 실행합니다
이 기사는 C에서execvp
함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.
execvp
함수를 사용하여 C에서 프로세스 이미지 바꾸기
Unix 기반 시스템에는 새 프로세스를 만들고 실행중인 프로세스에 새 프로그램 코드를로드하기위한 두 개의 별도 시스템 호출이 있습니다. 후자는execve
시스템 호출과 다른 인터페이스 인exec
라이브러리 함수 계열을 사용하여 수행됩니다. 6 개의 서로 다른 함수 프로토 타입이 있습니다 :execlp
,execle
,execv
,execvp
및execvpe
. 이 함수는 파일 이름 또는 새 프로그램 파일의 경로 이름을 사용하여로드하고 첫 번째 인수로 실행합니다. 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);
}
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