포크를 사용하여 C에서 현재 프로그램의 새 프로세스를 만드는 방법
이름이 포크인 이유는 무엇입니까?
우리가 자식 프로세스를 만들 때 이 자식 프로세스도 자신의 자식 프로세스를 만들 수 있습니다. 트리와 같은 구조를 형성하므로 포크라는 이름이 붙은 이유일 수 있습니다.
따라서 현재 프로세스의 복제본을 만드는 간단한 프로그램을 작성해 보겠습니다.
#include <stdio.h>
#include <unistd.h> // fork
int main() {
fork();
printf("Hello world -> My PID is %d\n", getpid());
return 0;
}
산출
Hello world -> My PID is 18131
Hello world -> My PID is 18132
그래서 위에서 무슨 일이 일어나고 있는지 설명하겠습니다.
프로그램 실행은 기본 기능에서 시작되며 현재 프로세스의 새 복제본을 생성하는 첫 번째 get
fork()
과 이제 두 자식 상위 프로세스가 여기에서 계속되고 get 문printf
이 있으므로 콘솔에 인쇄합니다.Note: Whenever program get a
fork()
statement then at the same instant a clone of it is create and start executing from there only in both the process i.e. Parent and Child.
이 예제를 통해 포크에 대해 자세히 살펴보겠습니다.
#include <stdio.h>
#include <unistd.h> // fork
int main() {
printf("Program execution start here.\n");
int r = fork();
printf(
"Hello world -> My PID is %d, I am %s process\n",
getpid(),
r==0 ? "child" : "parent"
);
return 0;
}
산출
Program execution start here.
Hello world -> My PID is 548, I am parent process
Hello world -> My PID is 549, I am child process
위에서 무슨 일이 일어나고 있는지 설명하겠습니다.
프로그램 실행이 시작되고 첫 번째 줄
printf
을 가져오므로 콘솔에 인쇄한 다음 fork
문을 가져오므로 이 줄에 새 자식 프로세스를 만듭니다. 이제 부모 프로그램fork
에서는 자식 프로세스의 반환pid
이지만 자식 프로세스에서는 0을 반환하므로 반환 값을 확인하고 그에 따라 인쇄합니다.NOTE:
fork()
returns -1 if it failed to clone the process.
여기에 하나의 예가 더 있습니다.
#include <stdio.h>
#include <unistd.h> // fork
int main() {
printf("Program execution start here.\n");
int r;
for (int i=0; i<5; i++) {
if ((r=fork())==0) {
break;
}
}
printf(
"Hello world -> My PID is %d, I am %s process\n",
getpid(),
r==0 ? "child" : "parent"
);
return 0;
}
산출
Program execution start here.
Hello world -> My PID is 635, I am child process
Hello world -> My PID is 636, I am child process
Hello world -> My PID is 637, I am child process
Hello world -> My PID is 638, I am child process
Hello world -> My PID is 634, I am parent process
Hello world -> My PID is 639, I am child process
이 프로그램의 출력은 마지막 하위 프로세스 이전의 상위 프로그램 출력으로 이상하게 보입니다. 위의 코드에서 무슨 일이 일어나는지 설명하겠습니다.
루프에서
fork()
를 실행하고 응답은 미리 정의된 변수r
에 저장됩니다. 따라서 자식 프로세스에서 zero
가 되어 자식 프로세스에서 루프가 끊어지고 추가 프로그램이 실행됩니다. 그러나 상위 프로그램 루프에서는 중단되지 않고 계속해서 새로운 하위 프로세스를 생성합니다.따라서 이러한 자식 프로세스는 CPU에 의해 병렬로 생성되고 실행됩니다. 그러나 마지막 하위 프로세스 루프 생성 후 상위 프로세스에서 명령문 실행
printf
이 중단되고 계속 실행되기 때문에 하위 프로세스 이후에 마지막 하위 프로세스가 실행됩니다.그런데 왜 마지막 프로세스가 부모 이후에 실행됩니까?
한 가지 이유는 메모리에 자식 프로세스의 복제본을 만들고 CPU에서 실행하도록 예약하는 데 시간이 걸릴 수 있습니다. 그러나 이미 실행 중인 부모 프로그램이 먼저 실행됩니다.
NOTE: The above reason for execution order may be not accurate. It is just one assumption made by me. So the execution order may vary from machine to machine.
이것이 현재 프로세스를 복제하는 것입니다
fork
. 위에서 나는 어딘가 틀릴 수 있습니다. 발견하시면 댓글로 적어주세요. 끝까지 읽어주셔서 정말 감사합니다.요약
fork
를 사용하여 현재 프로세스를 복제할 수 있습니다. fork()
명령문을 얻은 위치에서 시작됩니다. 따라서 하위 프로세스는 거기에서만 실행됩니다. fork
는 부모 프로그램에서 생성된 자식 프로세스의 PID를 반환하지만 생성된 자식 프로세스에서는 0
를 반환합니다. 따라서 반환 값을 기반으로 논리를 사용하여 자식 프로세스와 부모 프로세스를 구별할 수 있습니다. 이 게시물이 마음에 드셨다면 엄지척 부탁드립니다.
Reference
이 문제에 관하여(포크를 사용하여 C에서 현재 프로그램의 새 프로세스를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/namantam1/how-to-create-new-process-of-current-program-in-c-using-fork-24ho텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)