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