프로세스 이미지 오버레이

프로그램을 실행 중이고 현재 프로그램에서 다른 프로그램을 실행한다고 가정합니다. 이것이 가능한가? 프로세스 이미지를 오버레이하는 개념을 구현하면 어떨까요? 괜찮지 만 현재 실행중인 프로그램은 어떻습니까? 그것도 실행할 수 있습니다. 현재 프로그램을 새 프로그램으로 오버레이했기 때문에 어떻게 가능합니까? 현재 실행중인 프로그램을 잃지 않고 두 프로그램을 실행하려면 어떻게해야합니까? 예, 가능합니다.

부모 프로세스와 새로 생성 된 자식 프로세스를 갖도록 자식 프로세스를 만듭니다. 이미 우리는 부모 프로세스에서 현재 프로그램을 실행하고 있으므로 새로 생성 된 프로세스를 자식에서 실행합니다. 이런 식으로 현재 프로그램에서 다른 프로그램을 실행할 수 있습니다. 단일 프로그램뿐만 아니라 많은 수의 자식 프로세스를 만들어 현재 프로그램에서 원하는 수의 프로그램을 실행할 수 있습니다.

다음 프로그램을 예로 들어 보겠습니다.

/ * 파일 이름 : helloworld.c * /

#include<stdio.h>

void main() {
   printf("Hello World\n");
   return;
}

/ * 파일 이름 : execl_test.c * /

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

void main() {
   execl("./helloworld", "./helloworld", (char *)0);
   printf("This wouldn't print\n");
   return;
}

위의 프로그램은 helloworld와 execl_test의 프로세스 이미지를 오버레이합니다. 따라서 execl_test (printf ())의 프로세스 이미지 코드가 실행되지 않습니다.

컴파일 및 실행 단계

Hello World

이제 하나의 프로그램에서 다음 두 프로그램을 실행합니다. 즉, execl_run_two_prgms.c.

  • Hello World 프로그램 (helloworld.c)

  • 1부터 10까지 인쇄하는 While 루프 프로그램 (while_loop.c)

/ * 파일 이름 : while_loop.c * /

/* Prints numbers from 1 to 10 using while loop */
#include<stdio.h>

void main() {
   int value = 1;
   while (value <= 10) {
      printf("%d\t", value);
      value++;
   }
   printf("\n");
   return;
}

다음은 두 개의 프로그램을 실행하는 프로그램입니다 (하나는 하위 프로그램, 다른 프로그램은 상위 프로그램).

/ * 파일 이름 : execl_run_two_prgms.c * /

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

void main() {
   int pid;
   pid = fork();
   
   /* Child process */
   if (pid == 0) {
      printf("Child process: Running Hello World Program\n");
      execl("./helloworld", "./helloworld", (char *)0);
      printf("This wouldn't print\n");
   } else { /* Parent process */
      sleep(3);
      printf("Parent process: Running While loop Program\n");
      execl("./while_loop", "./while_loop", (char *)0);
      printf("Won't reach here\n");
   }
   return;
}

Note − sleep () 호출을 실행하여 자식 및 부모 프로세스가 순차적으로 실행되도록합니다 (결과와 겹치지 않음).

컴파일 및 실행 단계

Child process: Running Hello World Program
This wouldn't print
Parent process: Running While loop Program
Won't reach here

이제 하나의 프로그램에서 두 개의 프로그램을 실행합니다. 즉, execl_run_two_prgms.c, 위와 동일한 프로그램이지만 명령 줄 인수를 사용합니다. 그래서 우리는 자식 프로세스에서 helloworld.c와 부모 프로세스에서 while_loop.c라는 두 프로그램을 실행하고 있습니다. 이것은 다음과 같습니다-

  • Hello World 프로그램 (helloworld.c)

  • 명령 줄 인수에 따라 1에서 num_times_str까지 인쇄하는 While 루프 프로그램 (while_loop.c)

이 프로그램은 광범위하게 다음 작업을 수행합니다.

  • 자식 프로세스를 만듭니다.

  • 자식 프로세스가 helloworld.c 프로그램을 실행합니다.

  • 부모 프로세스는 명령 줄 인수 값을 프로그램에 인수로 전달하는 while_loop.c 프로그램을 실행합니다. 명령 줄 인수가 전달되지 않으면 기본값은 10으로 사용됩니다. 그렇지 않으면 주어진 인수 값을 사용합니다. 인수 값은 숫자 여야합니다. 알파벳으로 주어지면 코드가 유효하지 않습니다.

/ * 파일 이름 : execl_run_two_prgms.c * /

#include<stdio.h>
#include<string.h>
#include<unistd.h>

void main(int argc, char *argv[0]) {
   int pid;
   int err;
   int num_times;
   char num_times_str[5];
   
   /* In no command line arguments are passed, then loop maximum count taken as 10 */
   if (argc == 1) {
      printf("Taken loop maximum as 10\n");
      num_times = 10;
      sprintf(num_times_str, "%d", num_times);
   } else {
      strcpy(num_times_str, argv[1]);
      printf("num_times_str is %s\n", num_times_str);
      pid = fork();
   }
   
   /* Child process */
   if (pid == 0) {
      printf("Child process: Running Hello World Program\n");
      err = execl("./helloworld", "./helloworld", (char *)0);
      printf("Error %d\n", err);
      perror("Execl error: ");
      printf("This wouldn't print\n");
   } else { /* Parent process */
      sleep(3);
      printf("Parent process: Running While loop Program\n");
      execl("./while_loop", "./while_loop", (char *)num_times_str, (char *)0);
      printf("Won't reach here\n");
   }
   return;
}

다음은 프로그램의 자식 프로세스 인 execl_run_two_prgms.c에서 호출 된 helloworld.c 프로그램입니다.

/ * 파일 이름 : helloworld.c * /

#include<stdio.h>

void main() {
   printf("Hello World\n");
   return;
}

다음은 프로그램의 부모 프로세스 인 execl_run_two_prgms.c에서 호출되는 while_loop.c 프로그램입니다. 이 프로그램에 대한 인수는이를 실행하는 프로그램 (예 : execl_run_two_prgms.c)에서 전달됩니다.

/ * 파일 이름 : while_loop.c * /

#include<stdio.h>

void main(int argc, char *argv[]) {
   int start_value = 1;
   int end_value;
   if (argc == 1)
   end_value = 10;
   else
   end_value = atoi(argv[1]);
   printf("Argv[1] is %s\n", argv[1]);
   while (start_value <= end_value) {
      printf("%d\t", start_value);
      start_value++;
   }
   printf("\n");
   return;
}

컴파일 및 실행 단계

Taken loop maximum as 10
num_times_str is 10
Child process: Running Hello World Program
Hello World
Parent process: Running While loop Program
Argv[1] is 10
1 2 3 4 5 6 7 8 9 10
Taken loop maximum as 15
num_times_str is 15
Child process: Running Hello World Program
Hello World
Parent process: Running While loop Program
Argv[1] is 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

이제 오버레이 이미지 관련 라이브러리 함수를 살펴 보겠습니다.

#include<unistd.h>

int execl(const char *path, const char *arg, ...);

이 함수는 현재 실행중인 프로세스 이미지를 인수, 경로 및 인수에 언급 된 새 프로세스로 오버레이합니다. 인수가 새 프로세스 이미지로 전달되어야하는 경우 "arg"인수를 통해 전송되고 마지막 인수는 NULL이어야합니다.

이 함수는 오류가 발생한 경우에만 값을 반환합니다. 이미지 관련 호출을 오버레이하는 프로세스는 다음과 같습니다.

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

이러한 호출은 명령 줄 인수 (argv []), 환경 변수 (envp []) 및 기타 매개 변수 전달을 처리합니다.