Đó là để đơn giản hóa giao diện. Thay thế cho fork
và exec
sẽ là một cái gì đó giống như chức năng CreatProcess của Windows . Lưu ý có bao nhiêu tham số CreateProcess
, và nhiều trong số chúng là các cấu trúc với nhiều tham số hơn. Điều này là do mọi thứ bạn có thể muốn kiểm soát về quy trình mới phải được chuyển qua CreateProcess
. Trên thực tế, CreateProcess
không có đủ tham số, vì vậy Microsoft đã phải thêm CreatProcessAsUser và CreatProcessWithLogonW .
Với fork/exec
mô hình, bạn không cần tất cả các tham số đó. Thay vào đó, các thuộc tính nhất định của quá trình được bảo tồn trên exec
. Điều này cho phép bạn fork
, sau đó thay đổi bất kỳ thuộc tính quy trình nào bạn muốn (sử dụng cùng các chức năng bạn sử dụng bình thường), sau đó exec
. Trong Linux, fork
không có tham số và execve
chỉ có 3: chương trình để chạy, dòng lệnh để cung cấp cho nó và môi trường của nó. (Có các exec
chức năng khác , nhưng chúng chỉ là các hàm bao quanh execve
được cung cấp bởi thư viện C để đơn giản hóa các trường hợp sử dụng phổ biến.)
Nếu bạn muốn bắt đầu một quá trình với một thư mục hiện hành khác nhau: fork
, chdir
, exec
.
Nếu bạn muốn chuyển hướng stdin / stdout : fork
, đóng / mở tệp , exec
.
Nếu bạn muốn sử dụng công tắc: fork
, setuid
, exec
.
Tất cả những điều này có thể được kết hợp khi cần thiết. Nếu ai đó nghĩ ra một loại thuộc tính quy trình mới, bạn không phải thay đổi fork
và exec
.
Như larsks đã đề cập, hầu hết các Unix hiện đại đều sử dụng copy-on-write, do fork
đó không liên quan đến chi phí đáng kể.
fork(2)
trang man trong Linux nói:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Tôi tưởng tượng (nhưng không biết chắc chắn) rằng đây là trường hợp cho các hương vị Unix hiện đại khác.