본문 바로가기
linux

프로세스 이미지 복제

by 상레알 2010. 8. 15.
동시에 여러 기능을 수행하고자 하 떄에느느 스레드를 사용할 수도ㅛ 있고 init이 하는 것처럼 한 프로그램 안에서 완전히 개별적인 프로세스를 생성할 수 도 있다.

새 프로세스는 fork 함수를 호출해서 생성할 수있다. 이 시스템 호출은 현재 프로세스를 복제해서 프로세스 테이블에 새로운 항목을 생성한다. ( exec처럼 현재 프로세스를 다른 프로세스로 대체 하는것이 아니라). 새 프로세스는 현재 프로세스의 여러 특성을 물려 받는다. 새 프로세스는 원래의 프로세스와 동일 한 코드를 수행 한다. 그러나 자료 공간과 환경, 파일 서술자들은 개별적이다.

----------------------------------------------
#Include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
----------------------------------------------

부모 프로세스에서 호출한 fokr는 새 자식 프로세스의 PID를 돌려준다. 자식 프로세스는 원래의 프로세스와 동일한 코드를 수행하나, 자식 프로세스에서 호출한 fork는 0을 돌려준다는 점이 다르다.  코드에서는 이 반환값을 이용해서 현재 프로세스가 부모인지 자식인지를 판단할 수 있다.

프로세스 복제가 실패하면 fork는 -1을 돌려준다. 예를 들어 하나의 부모가 가질 수 있는 자식 프로세스 개수의 한계를 넘으면 복제가 실패할 수 있다. 그럴 때에는 오류 변수 errno에 EAGAIN이 설정된다. 또한 프로세스 테이블이 꽉 찼거나 가상 메모리가 부족해도 실패하게 되는데 이 경우는 errno에 ENOMEN이 설정된다.

fork 함수의 전형적인 사용법은

 pid_t new_pid;

new_pid = fork();

switch(new_pid) {
case -1 :   /* 오류 */
break;
case 0  :  /* 자식 프로세스 */
breakl
default : /* 부모 프로세스 */
break;
}

fork가 호출되면  프로그램은 두개 의 개별적인 프로세스 들로 분리된다. fork로 띄운 자식 프로세스는 고유한 수명을 가지며, 부모 프로세스와는 독립적으로 실행된다. 그런데 부모 프로세스에서 자식 프로세스가 종료되었는지를 알아야 하는 경우가 있다. 자식 프로세스가 끝날때 까지 기다리게 하려면 wait 함수를 사용한다.

#Include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *stat_loc);

wait 시스템 호출은 자식 프로세스들 중 하나가 종료될때 까지 부모 프로세스를 대기시킨다. 일반적인 경우 이 호출은 종료된 자식 프로세스의 PID를 돌려준다. 그리고 stat_loc이 널 포인터가 아닌 경우 stat_loc이 가리키는 변수에 그 자식 프로세스의 상태 정보를 담은 값이 설정된다. 이 값에서 자식 프로세스의 종료 코드(main의 반환값 또는 exit에 지정한 값)를 얻을 수 있다.



'linux' 카테고리의 다른 글

레이스 컨디션  (0) 2010.12.13
데몬(demon) 슈퍼데몬 (xinnetd)  (0) 2010.12.08
스레드  (0) 2010.08.17
입출력 재지정  (0) 2010.08.17
좀비 프로세스  (0) 2010.08.17
프로세스 이미지 대체하기  (0) 2010.08.15
새 프로세스 시작하기  (0) 2010.08.15
프로세스 일정 관리  (0) 2010.08.14
프로세스와 신호  (0) 2010.08.13
vim 설정  (0) 2010.06.30