Vì vậy, khi một lệnh được bắn từ shell, fork () kế thừa một tiến trình con của nó và exec () tải tiến trình con vào bộ nhớ và thực thi.
Không hẳn. fork()
nhân bản quá trình hiện tại, tạo ra một đứa trẻ giống hệt nhau. exec()
tải một chương trình mới vào quy trình hiện tại, thay thế chương trình hiện có.
Qs của tôi là:
Nếu quy trình con chứa tất cả các thuộc tính của quy trình cha (là quy trình ban đầu), thì nhu cầu của quy trình con này là gì? Quá trình ban đầu cũng có thể đã được tải vào bộ nhớ.
Nhu cầu là vì quá trình cha mẹ chưa muốn chấm dứt; nó muốn một quy trình mới được thực hiện và làm một cái gì đó cùng lúc mà nó tiếp tục thực hiện.
Liệu khái niệm fork và exec này có áp dụng cho tất cả các chương trình thực thi trong UNIX không? Giống như cho kịch bản shell cũng hay chỉ cho các lệnh? Nó cũng áp dụng cho các lệnh dựng sẵn shell?
Đối với các lệnh bên ngoài, shell thực hiện fork()
để lệnh chạy trong một tiến trình mới. Nội dung chỉ được chạy bằng vỏ trực tiếp. Một lệnh đáng chú ý khác là exec
, nó báo shell cho exec()
chương trình bên ngoài mà không cần fork()
ing trước . Điều này có nghĩa là bản thân shell được thay thế bằng chương trình mới và do đó, chương trình đó không còn tồn tại khi nó thoát. Nếu bạn nói, exec true
sau đó /bin/true
sẽ thay thế vỏ của bạn, và thoát ngay lập tức, không để lại gì trong thiết bị đầu cuối của bạn nữa, vì vậy nó sẽ đóng lại.
khi sao chép vào khái niệm ghi được sử dụng nếu tôi thực thi lệnh / script?
Trở lại thời kỳ đồ đá, fork()
thực sự phải sao chép tất cả bộ nhớ trong quy trình gọi sang quy trình mới. Copy on Write là một tối ưu hóa trong đó các bảng trang được thiết lập để hai quá trình bắt đầu chia sẻ tất cả cùng một bộ nhớ và chỉ các trang được ghi bởi một trong hai tiến trình được sao chép khi cần.