내가 공부한후 후에도 참고할겸 작성하는 글 입니다.
리눅스 시스템프로그래밍 2판을 참고하였습니다. 참고로 저는 WSL2 환경에서 공부중 입니다.
1. fork란 무엇인가?
간단히 새로운 process를 만드는 것인대 exec와 다른점이 있다면 parent process를 그대로 유지하면서 child process가 따로 생기는 것 이다.
두 프로세스 모두 계속 실행 상태이며 fork()로 인해 생성된 process는 아무일도 없었던 것처럼 계속 실행된다.
2. 함수의 정의
▶ 우선 함수의 prototype을 알아본후 하나씩 설명해 나가겠다
▶ fork로 새로운 process를(child-process) 만들때 부모 process와 동일한 코드를 갖게된다.
하지만 child가 생긴 이후부터는 별도의 context정보를 갖으며, 각각의 program-counter또한 달라진다.
자식과 부모 프로세스는 다음과 같은 필수적인 항목을 제외하고는 거의 모든 측면에서 동일하다.
1) 자식 process의 pid는 부모 process와는 다른 값으로 새롭게 할당된다.
2) 자식 process의 ppid(parent-pid)는 부모 process의 pid가 된다.
3) 자식 process에서 리소스 통계는 0으로 초기화 된다.
4) 처리되지 않은 시그널은 모두 사라지고 자식process로 상속되지 않는다.
5) 부모process에서 가지고 있던 파일 lock은 자식process로 상속되지 않는다.
▶ fork성공시 child process에서는 return값이 0 이고, parent에서는 child process의 pid값을 return하게 된다.
이는 간단히 부모가 적어도 자식의 고유번호는 알아야 한다고 생각하면 편하게 받아들여 질 것이다.
▶ 만약 fork() 호출이 실패한다면 process는 생성되지 않으며 -1값을 반환함과 동시에 errno를 적절한 값으로 할당한다. 가능한 errno는 3가지 정도가 있는대 다음과 같다.
1) EAGAIN
리소스를 다 사용해버려서 더이상 할당할수 있는 pid를 다 써버린 경우 새 process의 생성이 불가능하다.
2) ENOMEM
요청을 처리하기 위한 커널 메모리가 부족하다
3) ENOSYS
fork()를 지원하지 않는 프로그램일 경우, 대부분 가상주소환경을 제공하기 어려운경우에 해당한다.
3. 예시
기존의 process가 하나 실행되고 있던 도중 fork가 호출되어 2개의 process로 나뉘어지는 모습이다.
논리적 흐름을 같이 확인해보자
parent라는 근본이 되는 process의 흐름에서 fork로 인하여 추가적인 process가 파생되었다.
이후부터는 각각의 context정보를 갖고 이후의 code들을수행해 나간다. 위의 예시에서는 각각의 pid를 이용하여 출력문을 조절하였다.
▶ fork는 그 단독으로 사용되기 보다는 주로 exec와 함께 사용된다고 한다. 새 process를 생성후 새로운 바이너리 파일을 적제하는 것 이다.
다음 예제는 새로운 process를 생성후 /bin/windlass 바이너리를 실행하는 코드이다.
부모process는 이제 새로운 자식 process가 생겼다는 사실말고는 아무런 변화가없다.
execv()의 호출은 자식 process가 /bin/windlass 프로그램을 실행하도록 한다.
4. 끝으로
요즘 자료구조로 linked_list를 집중적으로 보고있었는대 이또한 흥미로운 내용이며, 주로 열혈자료구조 책을 정독 중이며, 추가적으로 https://www.geeksforgeeks.org/data-structures/linked-list/ 라는 좋은 싸이트에서 자료구조를 공부중이다. 영어또한 읽기에 부답없는 서체를 사용하기에 공부하기에 적합한 싸이트 이다.
다음 번 글 주제로는 좀비process에 대하여 짧은 글을 써볼 예졍이다.
'CS > System Programming (2021-2)' 카테고리의 다른 글
[시스템 프로그래밍] wait 함수 (0) | 2022.01.19 |
---|---|
[시스템 프로그래밍] Zombie Process : 좀비 프로세스 (0) | 2022.01.19 |
[시스템 프로그래밍] exec 함수들 (0) | 2022.01.19 |
[시스템 프로그래밍] Process : 프로세스 (0) | 2022.01.19 |
Vim 에디터 사용법 (vi 에디터) (0) | 2022.01.18 |
댓글