ฉันกำลังมองหาความแตกต่างระหว่างสิ่งทั้งสี่นี้ใน Google และฉันคาดหวังว่าจะมีข้อมูลจำนวนมากเกี่ยวกับเรื่องนี้ แต่จริงๆแล้วไม่มีการเปรียบเทียบที่ชัดเจนระหว่างการโทรสี่สาย
ฉันตั้งค่าเกี่ยวกับการพยายามรวบรวมพื้นฐานแบบคร่าว ๆ ดูความแตกต่างระหว่างการเรียกระบบเหล่านี้และนี่คือสิ่งที่ฉันได้รับ ข้อมูลทั้งหมดนี้ถูกต้อง / ฉันไม่มีข้อมูลสำคัญอะไร
Fork
โดยทั่วไปแล้วการเรียก fork จะทำซ้ำกระบวนการปัจจุบันเหมือนกันเกือบทุกวิธี (ไม่ใช่ทุกสิ่งที่ถูกคัดลอกมาตัวอย่างเช่นข้อ จำกัด ทรัพยากรในการใช้งานบางอย่าง แต่แนวคิดก็คือการสร้างสำเนาให้ใกล้เคียงที่สุด
กระบวนการใหม่ (เด็ก) รับรหัสกระบวนการที่แตกต่าง (PID) และมี PID ของกระบวนการเก่า (พาเรนต์) เป็นพาเรนต์ PID (PPID) เนื่องจากทั้งสองกระบวนการกำลังทำงานในรหัสเดียวกันทุกประการพวกเขาสามารถบอกได้ว่าโค้ดใดที่โค้ดส่งคืนของ fork - เด็กได้รับ 0 ผู้ปกครองได้รับ PID ของเด็ก ทั้งหมดนี้เป็นเรื่องสมมติว่า fork call ใช้งานได้หากไม่ใช่จะไม่มีการสร้างลูกและผู้ปกครองจะได้รับรหัสข้อผิดพลาด
Vfork
: ความแตกต่างพื้นฐานระหว่าง vfork และทางแยกคือเมื่อกระบวนการใหม่ถูกสร้างขึ้นด้วย vfork () กระบวนการหลักถูกระงับชั่วคราวและกระบวนการลูกอาจยืมพื้นที่ที่อยู่ของผู้ปกครอง สถานการณ์แปลก ๆ นี้ดำเนินต่อไปจนกระทั่งกระบวนการลูกออกจากกันหรือเรียกใช้ execve () ณ จุดที่กระบวนการหลักดำเนินต่อไป
ซึ่งหมายความว่ากระบวนการลูกของ vfork () จะต้องระมัดระวังเพื่อหลีกเลี่ยงการแก้ไขตัวแปรของกระบวนการหลักโดยไม่คาดคิด โดยเฉพาะอย่างยิ่งกระบวนการลูกจะต้องไม่ส่งคืนจากฟังก์ชันที่มีการเรียก vfork () และจะต้องไม่เรียก call exit () (หากต้องการออกก็ควรใช้ _exit () จริง ๆ แล้วนี่ก็เป็นจริงสำหรับเด็กด้วย ของส้อมปกติ ())
Exec :
การเรียก exec เป็นวิธีการโดยทั่วไปแทนที่กระบวนการปัจจุบันทั้งหมดด้วยโปรแกรมใหม่ มันโหลดโปรแกรมลงในพื้นที่กระบวนการปัจจุบันและเรียกใช้จากจุดเริ่มต้น exec () แทนที่กระบวนการปัจจุบันด้วยการปฏิบัติการที่ชี้โดยฟังก์ชั่น การควบคุมจะไม่กลับสู่โปรแกรมดั้งเดิมเว้นแต่ว่าจะมีข้อผิดพลาด exec ()
Clone :
โคลนในฐานะส้อมสร้างกระบวนการใหม่ ไม่เหมือนกับ fork การเรียกเหล่านี้อนุญาตให้กระบวนการ child แบ่งใช้ส่วนของบริบทการดำเนินการกับกระบวนการเรียกเช่นพื้นที่หน่วยความจำตารางไฟล์ descriptors และตารางตัวจัดการสัญญาณ
เมื่อกระบวนการลูกถูกสร้างขึ้นด้วยโคลนมันดำเนินการฟังก์ชั่นการใช้งาน fn (หาเรื่อง) (สิ่งนี้แตกต่างจาก fork ซึ่งการประมวลผลดำเนินการต่อในชายด์จากจุดที่เรียก fork ดั้งเดิม) อาร์กิวเมนต์ fn เป็นตัวชี้ไปยังฟังก์ชันที่เรียกว่าโดยกระบวนการ child ที่จุดเริ่มต้นของการดำเนินการ อาร์กิวเมนต์หาเรื่องถูกส่งผ่านไปยังฟังก์ชัน fn
เมื่อแอปพลิเคชันฟังก์ชัน fn (ARG) ส่งคืนกระบวนการลูกจะยุติ จำนวนเต็มที่ส่งคืนโดย fn คือรหัสออกสำหรับกระบวนการลูก กระบวนการลูกอาจยุติอย่างชัดเจนโดยการเรียก exit (2) หรือหลังจากได้รับสัญญาณที่ร้ายแรง
แบบฟอร์มข้อมูล:
- ความแตกต่างระหว่าง fork และ exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
ขอบคุณที่สละเวลาอ่าน! :)
fork()
ที่เป็นใน Linux และอาจ BSD ทั้งหมด) ยืมพื้นที่ที่อยู่ของผู้ปกครอง สิ่งที่มันทำนอกเหนือจากการโทรexecve()
หรือ_exit()
มีศักยภาพที่ดีในการทำให้ผู้ปกครองสับสน โดยเฉพาะอย่างยิ่งการexit()
เรียกatexit()
ตัวจัดการและ "finalizers" อื่น ๆ เช่นมันล้างกระแส stdio การกลับมาจากvfork()
เด็กอาจเป็นไปได้ (เหมือนอย่างที่เคยเป็นมาก่อน) ทำให้กองซ้อนของผู้ปกครองสับสน
fork
syscall หรือไม่