[CS] 시스템 콜이란? + fork() 함수
시스템 콜
컴퓨터 프로그램이 운영 체제 또는 커널의 서비스에 접근하기 위해 사용하는 인터페이스
프로그램이 특정 기능을 수행하기 위해 시스템 콜을 호출하면, 운영 체제는 해당 기능을 실행하고 결과를 프로그램에 반환한다.
일반적인 시스템 콜에는 파일 입출력, 프로세스 관리, 메모리 할당, 네트워크 통신 등의 기능이 있다.
시스템 콜은 일반적으로 저수준 프로그래밍 언어나 어셈블리어에서 호출되지만, 고수준 언어에서도 이러한 시스템 콜을 간접적으로 호출할 수 있는 라이브러리나 런타임 환경을 통해 사용한다.
저수준 프로그래밍 언어로 대표적인 C와 C++에서 시스템 콜을 직접 호출하는 것은 일반적으로 권장되지 않지만, 표준 라이브러리나 운영체제에서 제공하는 라이브러리 함수를 통해 간접적으로 호출할 수 있다.
대표적인 예시로 fork(), exec(), open(), read(), write(), close() 등이 있고, 이러한 함수들은 시스템 콜을 호출하고, 운영체제에 해당 기능을 수행하도록 요청한다.
시스템 콜의 대표적인 함수 fork()
fork() 함수를 호출하면 현재 실행 중인 프로세스의 복사본이 생성되어 새로운 프로세스가 만들어진다. 이 새로운 프로세스는 부모 프로세스의 복사본으로, 동일한 코드와 데이터를 가지고 있다. 하지만 부모 프로세스와 새로운 자식 프로세스는 각자의 독립적인 메모리 공간을 가지고 있어서 한 프로세스의 변경이 다른 프로세스에 영향을 주지 않는다.
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 자식 프로세스일 때 동작함
} else if (pid > 0) {
// 부모 프로세스일 때 동작함
printf("부모 프로세스의 PID: %d\n", getppid()); //부모 프로세스의 PID 출력
}
return 0;
}
부모 프로세스에서는 새로 생성된 자식 프로세스의 PID를 반환한다. 자식 프로세스는 0을 반환한다. 부모 프로세스의 PID는 fork() 함수를 호출하기 전에 이미 생성되어 있던 본래 프로세스의 식별자다. 부모 프로세스의 PID를 얻기 위해서는 getppid() 함수를 통해 알 수 있다.
그러나 이러한 함수들을 직접 호출하기보다 이러한 함수들을 사용하는 고수준의 인터페이스를 제공하는 라이브러리를 활용하는 것이 일반적으로 더 안전하고 편리하다. 이는 코드의 가독성과 유지보수성을 높이며, 시스템에 대한 의존성을 줄여 이식성을 향상시킨다.