티스토리 뷰
*공부 기록용으로 하는 블로그입니다.잘못된 개념이나 오타가 있을 수 있습니다. 잘못된 정보알려주시면 수정하겠습니다!*
fork()란?
-fork함수는 운영체제에서 사용되는 시스템 콜 중 하나입니다.함수를 호출한 프로세스를 복사해 자식프로세스를 만드는 기능을 합니다. 즉 원래 프로세스는 부모 프로세스가 되는것이고 복사한 프로세스는 자식 프로세스가됩니다. fork 함수는 리턴값이 생성된 프로세스의 pid입니다. 즉 자식 프로세스의 pid값을 리턴하게 됩니다. 부모 프로세스에서는 pid가 자식프로세스의 pid값일 것이고, 자식프로세스는 0이 리턴됩니다. 이 자식프로세스는 부모프로세스와 동일한 코드, 데이터,힙을 공유하지만 스택은 따로 가집니다. 그래서 두 프로세스 모두 fork() 호출 이후의 코드를 똑같이 실행합니다.
int fork(); (부모프로세스 리턴값 -> 자식프로세스의 pid값(0보다 큰 값) (자식프로세스 리턴값 -> 0) (에러 -> -1)
예시로
pid_t pid;
pid = fork();
if(pid == 0){
printf("hello! i'm child!");
exit(0);
}
printf("hello! i'm parent!");
exit(0);
이 코드를 실행하면
hello! i'm child!
hello! i'm parent!
or
hello! i'm parent!
hello! i'm child!
가 나옵니다. 이 순서가 뒤바뀔 수 있는 이유는 프로세스를 복사를 한후엔 동시에 실행 되기 때문에 부모와 자식 프로세스중 어느것이 먼저 실행되는지는 모릅니다. 만약 순서를 고정되게 하고 싶다면 둘이 시간차를 이용해 출력을 하게 하면 됩니다.
wait()함수
-wait 함수는 부모 프로세스가 자식 프로세스가 종료될 때까지 기다리도록하는 시스템 콜입니다.이 함수를 호출하게 되면 부모 프로세스는 자식프로세스의 종료를 기다리며, 자식프로세스가 종료되었을 때, 종료 상태를 반환받게 됩니다.
pid_t wait (int *status);
-반환형은 자식 프로세스의 ID이며, 입력인자는 자식프로세스 종료상태를 저장하기 위한 status포인터 변수입니다.status의 상태를 체크할 수있는 함수가 3개가 있습니다.
- WIFEXITED(status) : 자식 프로세스가 정상 종료했을때 참 리턴
- WEXITSATUS(status) : 자식프로세스의 반환값 리턴
- WIFSIGNALED(status) : 자식 프로세스가 시그널에 의해 종료한 경우 참 리턴
'OS' 카테고리의 다른 글
프로그램 -> 프로세스 변환과정 (컴파일) (0) | 2023.04.06 |
---|---|
파일모드란? (0) | 2023.04.06 |
LR 파싱 과정 (0) | 2023.04.04 |
cpu 명령어 모음 (0) | 2023.03.30 |
링커(Linker)란? (0) | 2023.03.30 |