계속 가지고 있던 의문인데, 왜 Unix에서는 프로세스를 생성할 때 직접 프로세스를 만들지 않고 부모 프로세스를 fork()
로 복제 후에 exec()
를 통해 내용을 갈아끼우는 걸까?
인터페이스를 단순화하기 위해서라고 한다.
fork()/exec()
의 대안으로 윈도우의 CreateProcess()
시스템 콜이 존재한다.
fork()
는 부모 프로세스의 자식 프로세스를 생성하고, exec()
는 코드를 원하는 내용으로 덮어 쓴다.
CreateProcess()
는 디스크에서 새 프로그램을 로드해 새 프로세스를 만든다. 즉 부모 프로세스를 복제하지 않고 새 프로세스를 하나 만든 뒤 프로그래머가 지시한 프로그램을 로드하게 한다.
그런데 CreateProcess()
는 엄청 많은 매개변수를 요구한다. 왜냐하면 fork()/exec()
는 부모 프로세스를 복제하면 자식 프로세스는 부모 프로세스의 각종 설정과 값들도 그대로 물려받기 때문에 그대로 사용하거나 원하는 값만 조금 바꿔주면 되지만, CreateProcess()
는 새 프로세스를 바로 생성하는 것이기 때문에 내가 컨트롤하기 원하는 모든 설정과 값을 해당 함수에 매개변수로 전달해줘야 하기 때문이다.
추가로, CreateProcess()
는 많은 매개변수 요구량에도 불구하고 충분하지 못해서 마이크로소프트는 CreateProcessAsUser()
와 CreateProcessWithLogonW()
함수를 새로 만들었다고 한다.
따라서 fork()/exec()
는 위에 설명한 이유로 매개변수가 필요하지 않다.
또 유닉스의 하나의 함수에 하나의 역할을 맡겨야 한다는 철학때문에 해당 함수들을 그렇게 디자인 했다고 생각하는 사람도 있었다.
https://unix.stackexchange.com/questions/136637/why-do-we-need-to-fork-to-create-new-processes
https://unix.stackexchange.com/questions/31118/why-is-the-default-process-creation-mechanism-fork
https://stackoverflow.com/questions/13839935/forking-and-createprocess
https://programmersheaven.com/discussion/279906/differences-between-createprocess-in-win32-and-fork-exec-in-unix