วางไข่ (คอมพิวเตอร์)

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

วางไข่ใน การ คำนวณหมายถึงฟังก์ชันที่โหลดและดำเนินการกับกระบวนการย่อยใหม่ กระบวนการปัจจุบันอาจรอให้โปรแกรมย่อยยุติการทำงานหรืออาจดำเนินการคำนวณพร้อมกันต่อไป การสร้างโปรเซสย่อยใหม่ต้องการหน่วยความจำที่เพียงพอซึ่งทั้งโปรเซสลูกและโปรแกรมปัจจุบันสามารถดำเนินการได้

มีฟังก์ชันการวางไข่ในDOSซึ่งสืบทอดมาจากMicrosoft Windows

นอกจากนี้ยังมีฟังก์ชันการวางไข่ในตระกูลอื่นในส่วนขยายทางเลือกของมาตรฐานPOSIX [1]

ฟังก์ชั่นการวางไข่ของ DOS/Windows

ฟังก์ชัน spawn ของ DOS/Windows ได้รับแรงบันดาลใจจากฟังก์ชันUnix forkและexec ; อย่างไรก็ตาม เนื่องจากระบบปฏิบัติการเหล่านี้ไม่รองรับ fork [2]ฟังก์ชัน spawn ถูกจัดหามาเพื่อแทนที่ fork-exec รวมกัน อย่างไรก็ตาม ฟังก์ชั่น spawn แม้ว่าจะเกี่ยวข้องกับกรณีการใช้งานทั่วไปอย่างเพียงพอ แต่ก็ขาดพลังเต็มรูปแบบของ fork-exec เนื่องจากหลังจากแยกการตั้งค่ากระบวนการใด ๆ ที่จะคงอยู่ exec อาจมีการเปลี่ยนแปลง อย่างไรก็ตาม ในกรณีส่วนใหญ่ ข้อบกพร่องนี้สามารถชดเชยได้โดยใช้ CreateProcess API ระดับล่าง

ในการเรียก spawnl , spawnlp , spawnvและspawnvp โปรเซสลูกจะสืบทอดสภาพแวดล้อมของพาเรนต์ ไฟล์ที่เปิดเมื่อมีการ เรียก วางไข่จะยังคงเปิดอยู่ในกระบวนการลูก

ต้นแบบ

int spawnl(int mode, char *path, char *arg0, ...);
int spawnle(int mode, char *path, char *arg0, ..., char ** envp);
int spawnlp(int mode, char *path, char *arg0, ...);
int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);
int spawnv(int mode, char *path, char **argv);
int spawnve(int mode, char *path, char **argv, char ** envp);
int spawnvp(int mode, char *path, char **argv);
int spawnvpe(int mode, char *path, char **argv, char ** envp);

ชื่อฟังก์ชัน

ชื่อฐานของแต่ละฟังก์ชันคือspawnตามด้วยตัวอักษรอย่างน้อยหนึ่งตัว:

จดหมาย หมายเหตุ
l อาร์กิวเมนต์บรรทัดคำสั่งจะถูกส่งผ่านไปยังฟังก์ชันทีละรายการ
วี อาร์กิวเมนต์บรรทัดคำสั่งจะถูกส่งไปยังฟังก์ชันเป็นอาร์เรย์ของพอยน์เตอร์
พี ใช้ตัวแปรอาร์กิวเมนต์ PATH เพื่อค้นหาไฟล์ที่จะดำเนินการ
อี อาร์เรย์ของตัวชี้ไปยังอาร์กิวเมนต์ของสภาพแวดล้อมถูกส่งผ่านไปยังกระบวนการย่อยอย่างชัดเจน

โหมด

อาร์กิวเมนต์ ของ โหมดกำหนดวิธีการรันเด็ก ค่าสำหรับโหมดคือ:

ชื่อ หมายเหตุ
P_OVERLAY ซ้อนทับกระบวนการหลักกับลูก ซึ่งทำลายพาเรนต์ สิ่งนี้มีผลเช่นเดียวกับฟังก์ชัน exec*
P_WAIT ระงับกระบวนการหลักจนกว่ากระบวนการลูกจะดำเนินการเสร็จสิ้น (วางไข่แบบซิงโครนัส)
P_NOWAIT, P_NOWAITO ดำเนินการเรียกกระบวนการอย่างต่อเนื่องพร้อมกับกระบวนการใหม่ (การวางไข่แบบอะซิงโครนัส)
P_DETACH เด็กทำงานในพื้นหลังโดยไม่ต้องเข้าถึงคอนโซลหรือแป้นพิมพ์ การโทรไปที่ _cwait ในกระบวนการใหม่จะล้มเหลว (การวางไข่แบบอะซิงโครนัส)

เส้นทาง

อาร์กิวเมนต์pathระบุชื่อไฟล์ของโปรแกรมที่จะดำเนินการ สำหรับspawnlpและspawnvpเท่านั้น หากชื่อไฟล์ไม่มีพาธและไม่ได้อยู่ในไดเร็กทอรีปัจจุบันตัวแปรสภาพแวดล้อม PATHจะกำหนดไดเร็กทอรีที่จะค้นหาไฟล์ สตริงที่argv ชี้ไปที่ [0] คือชื่อของโปรแกรมที่จะรัน

บรรทัดคำสั่งที่ส่งไปยังโปรแกรมที่วางไข่จะประกอบด้วยสตริงอักขระarg0ถึงargnในการเรียกวางไข่ ความยาวรวมสูงสุดที่ยอมรับได้ของสตริงเหล่านี้แตกต่างกันระหว่างคอมไพเลอร์ โดยมีตั้งแต่ 128 อักขระบน Digital Mars [3]ถึง 1024 บน Microsoft Visual C++ [4]หรือเท่าที่หน่วยความจำอนุญาตบน DJGPP [5]อาร์กิวเมนต์สุดท้ายหลังจาก argn จะต้องเป็นตัวชี้ NULL

argv

อาร์กิวเมนต์argvคืออาร์เรย์ของพอยน์เตอร์อักขระ ตัวชี้สุดท้ายในอาร์เรย์ต้องเป็นค่าว่างเพื่อระบุจุดสิ้นสุดของรายการ

envp

การเรียก spawnle , spawnlpe , spawnveและspawnvpeอนุญาตให้ผู้ใช้เปลี่ยนสภาพแวดล้อมของโปรเซสลูกโดยส่งรายการการตั้งค่าสภาพแวดล้อมในอาร์กิวเมนต์envp อาร์กิวเมนต์นี้เป็นอาร์เรย์ของพอยน์เตอร์อักขระ ตัวชี้แต่ละตัว (ยกเว้นตัวสุดท้าย) ชี้ไปที่สตริงที่สิ้นสุดด้วยค่า null ซึ่งกำหนดตัวแปรสภาพแวดล้อม ตัวแปรสภาพแวดล้อมมีรูปแบบ:

ชื่อ = ค่า

โดยที่ชื่อคือชื่อตัวแปรและค่าคือค่าของมัน ตัวชี้สุดท้ายในอาร์เรย์เป็นโมฆะ เมื่อ อาร์กิวเมนต์ envpเป็นโมฆะ เด็กจะสืบทอดการตั้งค่าสภาพแวดล้อมของพาเรนต์

ภายใต้ Microsoft Windows ฟังก์ชัน spawn*จะใช้ LoadModule เพื่อเรียกใช้กระบวนการที่เกิด และหากไม่สำเร็จ จะมีการพยายามวางไข่ในกระบวนการ MS-DOS ปกติ หากเกิดแอปพลิเคชัน Windows ขึ้นมา สามารถรับหมายเลขอ้างอิงอินสแตนซ์ได้โดยใช้exec_instancehandleget เป็นไปได้ที่จะระบุวิธีการแสดงโปรแกรมที่เกิดโดยใช้ฟังก์ชัน _exec_showset , _exec_showgetและ_exec_showreset

ส่งกลับค่า

ค่าที่ส่งกลับระบุสถานะการออกของโปรแกรมที่เกิด ค่าศูนย์บ่งชี้ว่าโปรแกรมที่วางไข่ดำเนินการสำเร็จ ค่าบวกบ่งชี้ว่าโปรแกรมที่เกิดแล้วดำเนินการ แต่ถูกยกเลิกหรือสิ้นสุดด้วยข้อผิดพลาด ค่าที่ส่งคืนคือสถานะการออกของกระบวนการลูก ค่าลบแสดงว่าโปรแกรมที่เกิดแล้วไม่ได้ดำเนินการ และตั้งค่า errno แล้ว ภายใต้ Microsoft Windows spawnจะส่งคืนรหัสข้อผิดพลาดที่ถูกปฏิเสธที่ส่งคืนจาก LoadModule เพื่อความเข้ากันได้กับไลบรารีรันไทม์ C อาจพบรหัสข้อผิดพลาดต่อไปนี้:

ค่า หมายเหตุ
-2 ไม่พบไฟล์
-3 ไม่พบเส้นทาง
-11 ไฟล์ .exe ไม่ถูกต้อง (สำหรับ Windows)
-13 DOS 4. 0 แอปพลิเคชัน
-14 ประเภท .exe ที่ไม่รู้จัก (อาจขยาย DOS)

ฟังก์ชั่นการวางไข่ POSIX

สามารถ ใช้ posix_spawn(3p)และพี่น้องposix_spawnpแทนfork และ execได้ แต่ไม่ได้ให้ความยืดหยุ่นเช่นเดียวกับการใช้forkและexecแยกกัน สิ่งเหล่านี้อาจเป็นการแทนที่ที่มีประสิทธิภาพสำหรับforkและexecแต่จุดประสงค์ของพวกเขาคือเพื่อให้การสร้างกระบวนการดั้งเดิมในสภาพแวดล้อมแบบฝังตัวซึ่งforkไม่ได้รับการสนับสนุนเนื่องจากขาดการ แปลที่อยู่ แบบ ไดนามิก

ประวัติ

คำอุปมา การวางไข่กล่าวคือ เพื่อผลิตลูกหลานเช่นเดียวกับการสะสมของไข่ มีการใช้ในช่วงต้นของ VMS ซึ่งปัจจุบันคือOpenVMSระบบปฏิบัติการ (1977) ในแวดวงวิชาการ มีการถกเถียงกันอย่างมีชีวิตชีวาระหว่างผู้เสนอUnix fork (สำเนาของเลย์เอาต์หน่วยความจำที่หยาบคาย แต่เร็ว) กับการวางไข่ ของ VMS (การสร้างพารามิเตอร์กระบวนการที่เชื่อถือได้ แต่ช้ากว่า) การอภิปรายนี้ฟื้นขึ้นมาเมื่อกลไกการวางไข่ VMS สืบทอดมาจากWindows NT (1993)

ดูเพิ่มเติม

อ้างอิง