C/C++에서 execvp() 함수를 사용하는 방법
이 기사에서는 C/C++에서 execvp() 함수를 사용하는 방법을 살펴보겠습니다.
UNIX에서 execvp() 함수는 C 프로그램을 사용하여 다른 프로그램을 실행하려는 경우 매우 유용합니다.
참고: 이 기능은 UNIX 기반 운영 체제에만 적용됩니다. Windows에서는 작동하지 않습니다.
예시를 사용하여 프로그램에서 UNIX 명령을 실행하는 방법을 살펴보겠습니다!
execvp()의 기본 구문
이 함수는 실행할 UNIX 명령의 이름을 첫 번째 인수로 사용합니다.
이것은
헤더 파일에 있으므로 프로그램에 포함해야 합니다.
#include <unistd.h>
int execvp(const char* command, char* argv[]);
여기에서 "command\는 PATH
환경 변수의 일부인 바이너리 실행 파일을 의미합니다. 따라서 사용자 지정 프로그램을 실행하려면 PATH
변수!
두 번째 인수(argv
)는 command
에 대한 인수 목록을 나타냅니다. 이것은 char*
문자열의 배열입니다.
여기서 argv
는 인수와 함께 전체 명령을 포함합니다.
예를 들어, 아래 배열은 argv
형식을 따릅니다.
char* argument_list[] = {"ls", "-l", NULL}; // NULL terminated array of char* strings
// Ok! Will execute the command "ls -l"
execvp("ls", argument_list);
이 배열은 NULL
로 끝나야 합니다. 즉, argv
의 마지막 요소는 NULL
포인터여야 합니다.
이제 C 프로그램은 어떻게 될까요?
이 기능은 명령에 현재 프로세스(C 프로그램)의 제어를 제공합니다. 따라서 C 프로그램은 즉시 실제 명령으로 대체됩니다.
따라서 execvp()
뒤에 오는 것은 프로그램이 완전히 인계되기 때문에 실행되지 않습니다!
그러나 어떤 이유로 명령이 실패하면 execvp()
는 -1을 반환합니다.
따라서 execvp()
를 사용할 때마다 C 프로그램을 유지하려면 일반적으로 fork()
를 사용하여 먼저 새 프로세스를 생성한 다음 를 사용합니다. >execvp()
를 새 프로세스에 적용합니다.
이것을 "fork-exec\ 모델이라고 하며 C를 사용하여 여러 프로세스를 실행하는 표준 방식입니다.
이제 이 기능을 더 잘 이해하기 위해 몇 가지 예를 살펴보겠습니다. 우리는 또한 execvp()
와 함께 fork()
를 사용할 것이므로 C 프로그램을 계속 사용할 수 있습니다!
C/C++에서 execvp() 사용 - 몇 가지 예
fork()
를 사용하여 새 프로세스를 생성하지 않고 execvp()
를 사용하려고 하면 정확히 어떤 일이 발생하는지 확인하려면. 아래 프로그램은 이것을 보여줍니다.
우리는 C 프로그램에서 "ls -l\을 실행할 것입니다.
execvp()
뒤의 printf()
문은 실행되지 않습니다. 다른 프로세스가 제어권을 가져갔기 때문입니다!
#include <stdio.h>
#include <unistd.h>
int main() {
char* command = "ls";
char* argument_list[] = {"ls", "-l", NULL};
printf("Before calling execvp()\n");
// Calling the execvp() system call
int status_code = execvp(command, argument_list);
if (status_code == -1) {
printf("Process did not terminate correctly\n");
exit(1);
}
printf("This line will not be printed if execvp() runs correctly\n");
return 0;
}
산출
Before calling execvp()
total 3
-rwxrwxrwx 1 user user 22088 May 30 16:37 a.out
-rwxrwxrwx 1 user user 16760 May 30 16:37 sample
-rw-rw-rw- 1 user user 1020 May 30 16:37 sample.c
보시다시피 execvp()
다음 부분은 "ls -l\이 프로세스를 제어했기 때문에 전혀 실행되지 않습니다!
같은 예제를 다시 작성하되 fork()
를 사용하여 execvp()
시스템 호출을 다른 프로세스 내부에 포함시키겠습니다.
지금 무슨 일이 일어나는지 봅시다.
#include <stdio.h>
#include <unistd.h>
int main() {
char* command = "ls";
char* argument_list[] = {"ls", "-l", NULL};
printf("Before calling execvp()\n");
printf("Creating another process using fork()...\n");
if (fork() == 0) {
// Newly spawned child Process. This will be taken over by "ls -l"
int status_code = execvp(command, argument_list);
printf("ls -l has taken control of this child process. This won't execute unless it terminates abnormally!\n");
if (status_code == -1) {
printf("Terminated Incorrectly\n");
return 1;
}
}
else {
// Old Parent process. The C program will come here
printf("This line will be printed\n");
}
return 0;
}
산출
Before calling execvp()
Creating another process using fork()...
This line will be printed
user@shell:$ total 3
-rwxrwxrwx 1 user user 22088 May 30 16:37 a.out
-rwxrwxrwx 1 user user 16760 May 30 16:37 sample
-rw-rw-rw- 1 user user 1020 May 30 16:37 sample.c
쉘에 있는 경우 출력이 이상하게 보일 수 있지만 이는 여러 프로세스가 병렬로 실행되기 때문입니다! 두 출력 모두 실제로 인쇄되었으므로 문제를 해결할 수 있었습니다.
결론
C/C++에서 execvp() 함수를 사용하여 C 프로그램에서 다른 프로그램을 실행하는 방법에 대해 배웠습니다. 그러나 이렇게 하면 다른 프로그램이 프로세스를 완전히 제어할 수 있습니다.
이로 인해 fork()
시스템 호출을 사용하여 다른 프로세스 아래에 이것을 포함해야 합니다. 바라건대, 이것이 당신에게 이해가 되었고 당신은 여전히 당신의 C 프로그램을 제어할 수 있는 동안 다른 프로그램을 실행할 수 있었습니다!
참조
- C의 execvp() 함수에 대한 Linux 매뉴얼 페이지