웹사이트 검색

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 매뉴얼 페이지