Linux

[Linux] Process - 3 (프로세스 생성과 실행)

개발로 먹고 살자 2022. 8. 8. 16:16

리눅스에서 프로세스는 사용자가 직접 명령어로 프로그램을

실행하여 생성하는 경우도 있지만

프로그램 안에서 다른 프로그램을 실행해 생성하는 경우도 존재한다.

 

 

이렇게 프로그램 안에서 다른 프로그램을 실행해 새로운 프로세스를 생성할 때는

system(), fork() 함수를 사용한다.

 

 

프로세스 생성 함수

프로그램 실행

int system(const char *command);

 

프로세스 생성

pid_t fork(void);

 

fork() 함수를 사용할 때도 주의할 점이 있다.

fork() 를 통해 자식 프로세스를 생성하면 부모 프로세스와 자식 프로세스는

순서에 관계 없이 실행되며 먼저 실행을 마친 프로세스는 종료가 된다.

 

 

그렇기 때문에 부모 프로세스에서 생성한 자식 프로세스가 끝나기도 전에

부모 프로세스가 먼저 종료가 될 수 있다.

 

 

정상적인 프로세스 종료 과정이라면 자식 프로세스가 종료를 위해 부모 프로세스에

종료 상태 정보를 보내고 이 정보를 받은 부모 프로세스가

프로세스 테이블에서 자식 프로세스를 삭제한다.

 

하지만 자식 프로세스가 끝나기도 전에 부모 프로세스가 먼저 끝나버린다면 자식

프로세스의 종료 상태를 부모 프로세스가 받지 못하여 좀비 프로세스가 발생한다.

 

프로세스 테이블 내에서 자식 프로세스가 죽지 않고 살아 있는 것이다.

따라서 이를 방지하기 위해 부모 프로세스와 자식 프로세스를 동기화해야 한다.

 

 

이 때 사용하는 것이 wait() 함수이다.

 

프로세스 동기화 함수

프로세스 동기화

pid_t wait(int *status);

 

특정 자식 프로세스와 동기화

pid_t waitpid(pid_t pid, int *status, int options);
int waitid(idtype_t idtype, id_t id, siginfot *infop, int options);

 

 

간단히 fork() 함수를 이용해서 출력해보자

fork() 를 사용하여 프로세스 내에서 자식 프로세스를 만들어 출력을 하였다.

fork() 함수는 부모 프로세스에는 자식 프로세스의 PID를 리턴하고

자식 프로세스에는 0을 리턴한다.

 

실행 결과

부모 프로세스에서 자식 프로세스의 PID를 받아 삭제 후 종료되어야 하지만

자식 프로세스보다 부모 프로세스가 먼저 출력되고 끝난 것을 볼 수 있다.

 

 

 

여기서 wait() 함수를 이용하여 프로세스를 동기화할 수 있다.

wait() 함수는 자식 프로세스가 종료할 때까지 부모 프로세스를 기다리게 한다.

자식 프로세스의 종료 상태는 status에 지정한 주소에 저장된다.

 

 

현재 코드를 확인해보면 부모 프로세스에서 wait을 통해 자식 프로세스가

끝날 때까지 대기하게 되고, 만약 자식 프로세스가 여러 개라도

하나의 자식 프로세스만 끝나면 부모 프로세스가 동작한다.

 

 

실행 결과

몇 번을 실행해도 자식 프로세스가 끝난 후 부모 프로세스가 종료된다.

 

 

이렇듯 fork()를 통한 프로세스 간의 통신은 동기화가 꼭 필요하다.