개요
이 글에서는 Python에서 fork() 함수를 사용해 자식 프로세스를 생성하고, 부모 프로세스와 자식 프로세스 각각의 프로세스 ID를 출력하는 방법을 알아봅니다.
fork()는 자기 자신의 복사본을 만드는 시스템 호출로, LINUX 및 UNIX 환경에서 매우 중요한 개념입니다. 주로 멀티스레드 환경에서 활용되며, 실행 흐름을 복제하여 부모 스레드로부터 자식 스레드를 생성하는 방식으로 동작합니다.
fork()의 반환값 이해하기
fork()의 반환값은 현재 코드가 어떤 프로세스에서 실행되고 있는지 판별하는 핵심 기준입니다.
- 0 반환: 현재 자식 프로세스 안에 있습니다.
- 양수 반환: 현재 부모 프로세스 안에 있으며, 반환된 값은 자식 프로세스의 PID입니다.
- 음수 반환: 프로세스 생성 중 오류가 발생했습니다.
fork()는 인자를 받지 않으며, 새로운 자식 프로세스가 생성되면 부모와 자식 두 프로세스 모두 다음 명령어부터 계속 실행합니다.
fork()는 os 모듈 또는 의사 터미널(pty) 모듈을 통해 사용할 수 있으므로, 상황에 맞게 os 또는 pty를 임포트하면 됩니다.
os.fork() 예제 코드
import os
def parentchild():
n = os.fork()
if n > 0:
print("Parent process : ", os.getpid())
else:
print("Child process : ", os.getpid())
# Driver code
parentchild()실행 결과
Parent process : 8023 Child process : 8024 $
위 예제에서 os.fork() 호출 이후 프로그램은 두 개의 프로세스로 분리됩니다. 부모 프로세스는 양수(자식의 PID)를 반환받아 첫 번째 분기를 실행하고, 자식 프로세스는 0을 반환받아 else 블록을 실행합니다. 각 프로세스는 os.getpid()로 자신의 고유한 프로세스 ID를 출력합니다.
pty.fork() 예제 코드
의사 터미널 유틸리티 모듈인 pty는 의사 터미널(pseudo-terminal) 개념을 처리하기 위해 정의된 모듈입니다. 이 모듈을 사용하면 다른 프로세스를 시작하고, 제어 터미널과 데이터를 읽고 쓸 수 있습니다.
import pty, os
def process_parent_child():
(process_id, fd) = pty.fork()
print("The Process ID for the Current process is: " + str(os.getpid()))
print("The Process ID for the Child process is: " + str(process_id))
process_parent_child()실행 결과
The Process ID for the Current process is: 12508 The Process ID for the Child process is: 12509
pty.fork()는 프로세스 ID와 파일 디스크립터(fd)를 튜플 형태로 반환한다는 점에서 일반적인 os.fork()와 차이가 있습니다.
주의사항
pty 모듈은 플랫폼에 크게 의존적입니다. 따라서 위 작업들을 수행하려면 반드시 UNIX 계열 운영체제(Linux, macOS 등) 환경을 사용해야 하며, Windows에서는 해당 기능을 지원하지 않습니다.