Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

사용법

#include <unistd.h>

pid_t fork(void);

설명

fork는 자식프로세스를 만들기 위해서 사용되는 프로세스 생성기이다. fork 에 의해 생성된 자식 프로세스는 자신만의 PID 를가지게 되며, PPID는 부모프로세스의 PID를 가지게 된다. 그밖에 PGID, SID 를 상속받으며, 파일지시자, 시그널등을 상속받는다. 단 파일잠금(lock)와 시그널 팬딩은 상속받지 않는다.

리눅스에서 fork 는 copy-on-write 를 이용해서 수행된다. 쓰레드 방식에 비해서 부모프로세스의 페이지 테이블을 복사하고 자식 프로세스에 대한 task 구조체를 만들기 위한 시간과 메모리의 소비가 크다는 단점이 있다.

반환 값

성공할경우 자식 프로세스의 PID가 부모에게 리턴되며, 자식에게는 0이 리턴된다. 실패할경우에는 -1 이 리턴되며, 절적한 errno 값이 설정된다.

에러

  • EAGAIN : 자식프로세스를 위한 테스크 구조체를 할당할수 없을경우. 주로 메모리 문제와 연관된다.

예제

#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int pid;

    pid = fork();
    if (pid > 0)
    {
        printf("부모 프로세스 %d : %d\n", getpid(), pid);
        pause();
    }
    else if (pid == 0)
    {
        printf("자식 프로세스 %d\n", getpid());
        pause();
    }
    else if (pid == -1)
    {
        perror("fork error : ");
        exit(0);
    }
}
코드 실행 결과다.
[root@localhost test]# ./fork
부모 프로세스 1322 : 1323
자식 프로세스 1323
ps 명령을 이용해서 프로세스 상태를 확인 할 수 있다.
[root@localhost /root]# ps -efj | grep fork
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root      1322   748  1322   748  0 10:33 ttyp0    00:00:00 ./fork
root      1323  1322  1322   748  0 10:33 ttyp0    00:00:00 ./fork