Computer Science/Operating System

[OS] 프로세스 API in POSIX

kyxxn 2024. 4. 30. 19:46
728x90

Fork()

자식 프로세스 생성하는 API
부모의 주소공간, 레지스터.. 등의 내용이 복사되어 자식이 만들어짐

int rc = fork();

rc == 0: 자식 프로세스

rc > 0: 부모 프로세스

Wait()

프로세스가 종료되지 않고, 대기하기
waitpid()도 포함

else 문의 부모 프로세스는 int wc = wait(NULL)을 통해

자식 프로세스가 종료될 때까지 실행을 잠시 중지 시킨다.

자식이 종료되면 Wait가 반환되는데, 자식 PID가 반환됨

이러면 fork() 후에 프로세스가 마음대로 출력되던 상황을 방지함

자식이 끝나야 부모가 동작하기 때문.

Exec()

자기 자신(부모 내용 복사)이 아닌, 다른 프로그램을 실행할 때 사용됨
fork()와 달리 비어있는 새 프로그램을 적재하여 실행함

if (rc == 0) { // child (new process)
        printf("hello, I am child (pid:%d)\n", (int) getpid());
        char *myargs[3];
        myargs[0] = strdup("wc"); // program: "wc" (word count)
        myargs[1] = strdup("p3.c"); // p3.c 단어 개수 셈
        myargs[2] = NULL; // 배열 끝, 마지막 NULL 대입

        execvp(myargs[0], myargs); // p3.c의 단어 개수를 센다
        // $ wc p3.c와 같은 동작
        printf("this shouldn’t print out"); // Execvp 실패하면 출력됨
}

Redirection (재지정 >)

표준 입출력도 파일로 취급함
= 파일을 변경하는 효과

자식 프로세스를 생성하면, 파일기술자도 복제됨

close(STDOUT_FILENO);를 통해 표준 출력을 재설정하게 되고,

open이 호출될 때 할당이 된다.

그래서 파일기술자 1번이 stdout이 아닌, ./p4.output이 됨 !