เมื่อคุณเรียกvfork()
กระบวนการใหม่จะถูกสร้างขึ้นและกระบวนการใหม่นั้นยืมอิมเมจกระบวนการของกระบวนการหลักโดยมีข้อยกเว้นของสแต็ก กระบวนการเด็กจะได้รับของตัวเองใหม่ดาวสแต็ค แต่ไม่อนุญาตให้มีฟังก์ชั่นที่เรียกว่าreturn
vfork()
ในขณะที่เด็กกำลังเรียกใช้กระบวนการหลักถูกบล็อกในขณะที่เด็กยืมพื้นที่ที่อยู่ของผู้ปกครอง
ไม่ว่าคุณจะทำอะไรทุกอย่างที่เข้าถึงสแต็กจะแก้ไขเฉพาะสแต็กส่วนตัวของเด็ก หากคุณปรับเปลี่ยนข้อมูลทั่วโลกสิ่งนี้จะแก้ไขข้อมูลทั่วไปและยังส่งผลกระทบกับผู้ปกครอง
สิ่งที่แก้ไขข้อมูลทั่วโลกเช่น:
เมื่อคุณโทร_exit()
(สำคัญไม่เคยโทรexit()
) เด็กจะถูกยกเลิกและการควบคุมจะถูกส่งกลับไปยังผู้ปกครอง
หากคุณเรียกใช้ฟังก์ชันใด ๆ จากexec*()
ตระกูลระบบจะสร้างพื้นที่ที่อยู่ใหม่ด้วยรหัสโปรแกรมใหม่ข้อมูลใหม่และส่วนหนึ่งของสแต็กจากพาเรนต์ (ดูด้านล่าง) เมื่อพร้อมแล้วเด็กจะไม่ยืมพื้นที่ที่อยู่จากเด็กอีกต่อไป แต่ใช้พื้นที่ที่อยู่ของตนเอง
การควบคุมจะถูกส่งกลับไปยังพาเรนต์เนื่องจากพื้นที่ของแอดเดรสไม่ได้ถูกใช้โดยกระบวนการอื่นอีกต่อไป
สำคัญ: บน Linux ไม่มีvfork()
การใช้งานจริง Linux ค่อนข้างใช้งานvfork()
ตามfork()
แนวคิดCopy on Write ที่นำเสนอโดย SunOS-4.0 ในปี 1988 เพื่อให้ผู้ใช้เชื่อว่าพวกเขาใช้งานvfork()
Linux เพียงแค่ตั้งค่าข้อมูลที่ใช้ร่วมกันและระงับผู้ปกครองในขณะที่เด็กไม่ได้โทร_exit()
หรือหนึ่งในexec*()
หน้าที่
Linux จึงไม่ได้รับประโยชน์จากการที่จริงvfork()
ไม่จำเป็นต้องตั้งค่าคำอธิบายพื้นที่ที่อยู่สำหรับเด็กในเคอร์เนล ผลนี้ในที่ไม่ได้เร็วกว่าvfork()
fork()
บนระบบที่ใช้จริงvfork()
มันเป็นปกติได้เร็วกว่า 3 เท่าfork()
และมีผลต่อประสิทธิภาพการทำงานของเปลือกหอยที่ใช้vfork()
- ksh93
เมื่อเร็ว ๆ นี้และBourne Shell
csh
เหตุผลที่คุณไม่ควรเรียกexit()
จากvfork()
เด็กเอ็ดคือว่าexit()
วูบวาบ stdio ในกรณีที่มีข้อมูล unflushed vfork()
จากเวลาก่อนที่จะเรียก นี่อาจทำให้เกิดผลลัพธ์ที่แปลก
BTW: posix_spawn()
มีการใช้งานด้านบนvfork()
ดังนั้นvfork()
จะไม่ถูกลบออกจากระบบปฏิบัติการ จะได้รับการกล่าวถึงว่าลินุกซ์ไม่ได้ใช้สำหรับvfork()
posix_spawn()
สำหรับสแต็กมีเอกสารน้อยนี่คือสิ่งที่หน้า man ของ Solaris พูดว่า:
The vfork() and vforkx() functions can normally be used the
same way as fork() and forkx(), respectively. The calling
procedure, however, should not return while running in the
child's context, since the eventual return from vfork() or
vforkx() in the parent would be to a stack frame that no
longer exists.
ดังนั้นการนำไปปฏิบัติอาจทำอะไรก็ได้ที่มันชอบ vfork()
โซลาริสใช้การดำเนินงานร่วมกันของหน่วยความจำสำหรับกรอบสแต็คของฟังก์ชั่นการโทร ไม่มีการนำไปใช้ให้สิทธิเข้าถึงส่วนที่เก่ากว่าของสแต็กจากพาเรนต์