프로세스 이미지 오버레이
프로그램을 실행 중이고 현재 프로그램에서 다른 프로그램을 실행한다고 가정합니다. 이것이 가능한가? 프로세스 이미지를 오버레이하는 개념을 구현하면 어떨까요? 괜찮지 만 현재 실행중인 프로그램은 어떻습니까? 그것도 실행할 수 있습니다. 현재 프로그램을 새 프로그램으로 오버레이했기 때문에 어떻게 가능합니까? 현재 실행중인 프로그램을 잃지 않고 두 프로그램을 실행하려면 어떻게해야합니까? 예, 가능합니다.
부모 프로세스와 새로 생성 된 자식 프로세스를 갖도록 자식 프로세스를 만듭니다. 이미 우리는 부모 프로세스에서 현재 프로그램을 실행하고 있으므로 새로 생성 된 프로세스를 자식에서 실행합니다. 이런 식으로 현재 프로그램에서 다른 프로그램을 실행할 수 있습니다. 단일 프로그램뿐만 아니라 많은 수의 자식 프로세스를 만들어 현재 프로그램에서 원하는 수의 프로그램을 실행할 수 있습니다.
다음 프로그램을 예로 들어 보겠습니다.
/ * 파일 이름 : 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 []) 및 기타 매개 변수 전달을 처리합니다.