Tôi đang tìm kiếm sự khác biệt giữa bốn người này trên Google và tôi dự đoán sẽ có một lượng thông tin khổng lồ về vấn đề này, nhưng thực sự không có bất kỳ so sánh chắc chắn nào giữa bốn cuộc gọi.
Tôi bắt đầu cố gắng biên dịch một loại cái nhìn cơ bản trong nháy mắt về sự khác biệt giữa các cuộc gọi hệ thống này và đây là những gì tôi nhận được. Là tất cả thông tin này là chính xác / tôi có thiếu điều gì quan trọng không?
Fork
: Cuộc gọi ngã ba về cơ bản tạo ra một bản sao của quy trình hiện tại, giống hệt nhau theo mọi cách (không phải mọi thứ đều được sao chép, ví dụ, giới hạn tài nguyên trong một số triển khai nhưng ý tưởng là tạo ra một bản sao càng gần càng tốt).
Quá trình mới (con) nhận ID tiến trình khác nhau (PID) và có PID của quy trình cũ (cha mẹ) là PID chính (PPID). Bởi vì hai quy trình hiện đang chạy chính xác cùng một mã, chúng có thể cho biết đó là mã trả về của ngã ba nào - đứa trẻ nhận được 0, cha mẹ nhận được PID của đứa trẻ. Tất nhiên, đây là tất cả, giả sử cuộc gọi ngã ba hoạt động - nếu không, không có con nào được tạo và cha mẹ nhận được mã lỗi.
Vfork
: Sự khác biệt cơ bản giữa vfork và fork là khi một quy trình mới được tạo bằng vfork (), quy trình cha mẹ tạm thời bị đình chỉ và quy trình con có thể mượn không gian địa chỉ của cha mẹ. Tình trạng kỳ lạ này tiếp diễn cho đến khi tiến trình con thoát ra hoặc gọi execve (), tại đó tiến trình cha mẹ tiếp tục.
Điều này có nghĩa là quy trình con của vfork () phải cẩn thận để tránh các biến bất ngờ của quy trình cha. Cụ thể, tiến trình con không được trả về từ hàm chứa lệnh gọi vfork () và nó không được gọi exit () (nếu cần thoát, nó nên sử dụng _exit (); thực ra, điều này cũng đúng với con của một ngã ba bình thường ()).
Exec :
Cuộc gọi exec là một cách cơ bản để thay thế toàn bộ quy trình hiện tại bằng một chương trình mới. Nó tải chương trình vào không gian quy trình hiện tại và chạy nó từ điểm vào. exec () thay thế tiến trình hiện tại bằng một hàm thực thi được trỏ bởi hàm. Kiểm soát không bao giờ trở lại chương trình gốc trừ khi có lỗi exec ().
Clone :
Clone, như ngã ba, tạo ra một quy trình mới. Không giống như fork, các cuộc gọi này cho phép tiến trình con chia sẻ các phần trong bối cảnh thực hiện của nó với quá trình gọi, chẳng hạn như không gian bộ nhớ, bảng mô tả tệp và bảng xử lý tín hiệu.
Khi tiến trình con được tạo bằng clone, nó sẽ thực thi ứng dụng hàm fn (arg). (Điều này khác với fork, trong đó việc thực thi tiếp tục ở trẻ em từ điểm của lệnh gọi fork ban đầu.) Đối số fn là một con trỏ tới một hàm được gọi bởi tiến trình con khi bắt đầu thực hiện. Đối số arg được truyền cho hàm fn.
Khi ứng dụng hàm fn (arg) trả về, tiến trình con kết thúc. Số nguyên được trả về bởi fn là mã thoát cho tiến trình con. Quá trình con cũng có thể chấm dứt rõ ràng bằng cách gọi thoát (2) hoặc sau khi nhận được tín hiệu gây tử vong.
Thông tin nhận được mẫu:
- Sự khác nhau giữa fork và exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/l Library / cmd / blcmdl2_clone.htmlm
Cảm ơn đã dành thời gian để đọc ! :)
fork()
Linux và có lẽ là tất cả các BSD) mượn không gian địa chỉ của cha mẹ. Bất cứ điều gì nó làm, ngoài việc gọi execve()
hoặc _exit()
, có một tiềm năng lớn để gây rối cho phụ huynh. Cụ thể, exit()
gọi atexit()
trình xử lý và "trình hoàn thiện" khác, ví dụ: nó xóa các luồng stdio. Trở về từ một vfork()
đứa trẻ có khả năng (giống như trước đây) làm xáo trộn chồng của cha mẹ.
fork
?