참고: https://www.codespeedy.com/the-fork-system-call-using-cpp/
이 포스트에서는 fork() 시스템 콜이 수행하는 작업과 리눅스 계열 시스템에서 어떻게 구현하는지 예제를 통해 알아보겠습니다.
fork() 시스템 콜 이란?
fork()는 새로운 자식 프로세스를 생성합니다. 부모 프로세스에서 fork()를 호출하면 메모리에 있는 정확한 사본을 다른 위치에 복사합니다. 부모 프로세스와 자식 프로세스 모두 주소 공간이 다르지만 동일한 메모리 세그먼트를 공유합니다.
문법:
#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);
fork() 시스템 콜은 생성한 자식 프로세스의 ID를 리턴합니다. 부모와 자식 둘 다 동일한 메모리 세그먼트를 공유하는데 실행 중인 프로세스가 부모인지 자식인지 어떻게 구분할까요? 자식 프로세스에서는 fork()의 리턴 값이 0이고 부모 프로세스에서는 양의 정수를 리턴하므로 이를 통해 구분할 수 있습니다.
부모인지 자식인지 확인하지 않는 예제
#include<iostream>
#include<unistd.h>
using namespace std;
int main() {
fork();
cout << "Hello, World!" << endl;
return 0;
}
위의 코드에서는 그냥 fork()를 호출하고 아무런 확인 작업을 하지 않아 결과 화면에서 누가 부모인지 자식인지 구분할 수 없습니다.
부모와 자식을 확인하는 예제
#include<iostream>
#include<unistd.h>
using namespace std;
int main() {
pid_t pid = fork();
if (pid == 0)
cout << "Output from the child process." << endl;
else
cout << "Output from the parent process." << endl;
return 0;
}
운영체제가 프로세스를 실행하는 순서를 알 수 없기 때문에 위의 결과 말고도 순서가 바뀌어 나올 수 있습니다. 이 프로그램을 3~4 번 실행해 보면 출력의 차이를 볼 수 있습니다.
fork()를 여러번 하면 프로세스가 몇 개일까?
흥미로운 질문입니다. 우리는 부모 프로세스와 자식 프로세스가 모두 동일한 메모리 세그먼트를 공유한다는 것을 알고 있습니다. 이것이 의미하는 바는 두 프로세스가 동일한 프로그램을 실행하고 있다는 것 입니다. 하지만 유일한 차이점은 자식 프로세스에서 호출된 fork()는 0을 반환한다는 점입니다. 여기서 흥미로운 부분은 하나의 자식 프로세스가 또 다른 자식 프로세스를 만드는 경우입니다. 하나의 프로세스가 자식 프로세스를 만들면 프로세스가 2개가 되기 때문에 fork()를 실행할 수록 프로세스의 갯수는 2의 거듭제곱으로 증가합니다.
다음의 예를 보겠습니다:
#include<iostream>
#include<unistd.h>
using namespace std;
int main() {
fork();
fork();
fork();
cout << "Hello, World!" << endl;
return 0;
}
관련 글
'dev > c++' 카테고리의 다른 글
[c++] 쓰레드 생성 (pthread) (10) | 2023.06.02 |
---|---|
[c++] 프로세스 ID 가져오기 (getpid, getppid) (7) | 2023.06.01 |
[c++] 더하기, 두 수의 합을 출력 (1) | 2018.04.24 |
[c++] 문자열 여러 행 출력하기 (cout) (0) | 2018.04.24 |
댓글