ดังนั้นเมื่อคำสั่งถูกไล่ออกจากเชลล์ fork () สืบทอดกระบวนการลูกของมันและ exec () โหลดกระบวนการลูกไปยังหน่วยความจำและดำเนินการ
ไม่มาก fork()โคลนกระบวนการปัจจุบันสร้างชายด์ที่เหมือนกัน exec()โหลดโปรแกรมใหม่เข้าสู่กระบวนการปัจจุบันแทนที่โปรแกรมที่มีอยู่
คำถามของฉันคือ:
หากกระบวนการลูกมีคุณลักษณะทั้งหมดของกระบวนการหลัก (ซึ่งเป็นกระบวนการดั้งเดิม) ดังนั้นความต้องการของกระบวนการลูกนี้คืออะไร? กระบวนการต้นฉบับอาจถูกโหลดไปยังหน่วยความจำ
จำเป็นต้องมีเนื่องจากกระบวนการหลักยังไม่ต้องการยกเลิก มันต้องการกระบวนการใหม่ที่จะออกไปและทำอะไรบางอย่างในเวลาเดียวกันกับที่มันยังดำเนินการต่อไปเช่นกัน
แนวคิด fork และ exec นี้ใช้กับโปรแกรมปฏิบัติการทั้งหมดใน UNIX หรือไม่เช่นเดียวกับเชลล์สคริปต์หรือเฉพาะสำหรับคำสั่งเท่านั้น มันใช้กับคำสั่ง shell builtin หรือไม่?
สำหรับคำสั่งภายนอกเชลล์ทำfork()เพื่อให้คำสั่งรันในกระบวนการใหม่ บิวอินจะถูกเรียกใช้โดยเชลล์โดยตรง คำสั่งที่น่าสังเกตอีกประการหนึ่งคือexecซึ่งบอกเชลล์ให้exec()กับโปรแกรมภายนอกโดยไม่ต้องเริ่มfork()ต้น ซึ่งหมายความว่าเชลล์เองจะถูกแทนที่ด้วยโปรแกรมใหม่และจะไม่อยู่ที่นั่นเพื่อให้โปรแกรมนั้นกลับไปเมื่อออก ถ้าคุณพูดexec trueแล้ว/bin/trueจะเปลี่ยนเชลล์ของคุณและออกทันทีโดยไม่ทิ้งอะไรไว้ในเทอร์มินัลของคุณอีกต่อไปดังนั้นมันจะปิด
เมื่อใช้การคัดลอกเมื่อเขียนแนวคิดหากฉันจะรันคำสั่ง / สคริปต์?
ย้อนกลับไปในยุคหินfork()จริง ๆ แล้วต้องคัดลอกหน่วยความจำทั้งหมดในกระบวนการเรียกไปยังกระบวนการใหม่ การคัดลอกเมื่อเขียนเป็นการเพิ่มประสิทธิภาพที่มีการตั้งค่าตารางหน้าเพื่อให้กระบวนการทั้งสองเริ่มต้นจากการแชร์หน่วยความจำเดียวกันทั้งหมดและจะคัดลอกเฉพาะหน้าที่เขียนโดยกระบวนการใดกระบวนการหนึ่งเท่านั้น