ไวยากรณ์:
ไวยากรณ์ของฟังก์ชัน fork() มีดังต่อไปนี้ มันจะส่งกลับค่าตัวเลขหรือ “undef” หากฟังก์ชัน fork() ทำงานได้สำเร็จ รหัสกระบวนการเฉพาะจะถูกส่งกลับหรือส่งคืน 0 สำหรับกระบวนการลูก หากฟังก์ชัน fork() ไม่ทำงาน จะคืนค่า 'undef'
รหัส หรือ ส้อมที่ไม่แน่นอน ( ) ;
ตัวอย่างที่ 1: การใช้ฟังก์ชัน Fork() อย่างง่าย
สร้างไฟล์ Perl ด้วยสคริปต์ต่อไปนี้ซึ่งสร้างกระบวนการลูกจากกระบวนการปัจจุบันโดยใช้ฟังก์ชัน fork() รหัสกระบวนการถูกพิมพ์หลังจากดำเนินการฟังก์ชัน fork() ตัวแปรของกระบวนการพาเรนต์และลูกจะถูกจัดเก็บไว้ในตำแหน่งหน่วยความจำที่แตกต่างกัน ดังนั้น หากค่าของตัวแปรมีการเปลี่ยนแปลงในกระบวนการหลัก ก็จะไม่ทำการเปลี่ยนแปลงใดๆ สำหรับตัวแปรเดียวกันของกระบวนการลูกหรือในทางกลับกัน ในสคริปต์นี้ ตัวแปรของกระบวนการหลักมีการเปลี่ยนแปลง จากนั้น ตัวแปรของกระบวนการทั้งแม่และลูกจะถูกพิมพ์
#!/usr/bin/perl
ใช้อย่างเข้มงวด ;
ใช้ คำเตือน ;
ใช้ 5.34.0 ;
#ประกาศตัวแปร
$var ของฉัน = 'ส้อมทดสอบ' ;
#แยกกระบวนการปัจจุบัน
$process_id ของฉัน = ส้อม ( ) ;
#ตรวจสอบรหัสกระบวนการ
ถ้า ( $กระบวนการ_id < 0 )
{
พูด 'ไม่สามารถแยกกระบวนการได้' ;
}
เอลซิฟ ( $กระบวนการ_id == 0 )
{
พูด 'กระบวนการย่อย:' ;
#พิมพ์ค่าตัวแปรของกระบวนการลูก
พูด 'ค่าของตัวแปร: $var' ;
}
อื่น
{
พูด 'กระบวนการหลัก: $process_id' ;
#อัพเดทค่าของตัวแปร
$var = 'ทดสอบส้อม 2' ;
#พิมพ์ค่าของตัวแปรของกระบวนการหลัก
พูด 'ค่าของตัวแปร: $var' ;
}
เอาท์พุท:
ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์ ตัวแปรของกระบวนการหลักได้รับการแก้ไขด้วยค่า 'Test Fork 2' แต่ตัวแปรของกระบวนการลูกยังคงไม่เปลี่ยนแปลง ดังนั้นค่าของตัวแปรของกระบวนการลูกคือ 'Test Fork' นั่นคือค่าหลังทางแยก:
ตัวอย่างที่ 2: การใช้ฟังก์ชัน Fork() และ Wait()
สร้างไฟล์ Perl ด้วยสคริปต์ต่อไปนี้ที่แสดงการใช้ฟังก์ชัน fork() กับฟังก์ชัน wait() มีการประกาศตัวแปรสามตัวที่จุดเริ่มต้นของสคริปต์ ฟังก์ชัน sleep() ถูกใช้ภายในบล็อกของกระบวนการหลักเป็นเวลา 1 วินาที และภายในกระบวนการลูกเป็นเวลา 2 วินาที ผลรวมของตัวแปรทั้งสองจะถูกคำนวณและจัดเก็บไว้ในตัวแปรอื่นภายในบล็อกของกระบวนการหลัก ค่าของตัวแปรทั้งสองจะถูกคูณและเก็บไว้ในตัวแปรอื่นภายในกระบวนการลูก ฟังก์ชัน wait() ถูกใช้ที่ส่วนท้ายของสคริปต์เพื่อรอให้งานของกระบวนการหนึ่งเสร็จสิ้นก่อนที่จะเริ่มงานของกระบวนการอื่น ถ้าฟังก์ชัน fork() ถูกใช้หลายครั้งในสคริปต์ และกระบวนการจำนวนมากกำลังทำงานพร้อมกัน สถานการณ์การชะงักงันอาจเกิดขึ้น ปัญหานี้สามารถแก้ไขได้โดยใช้ฟังก์ชัน wait()
#!/usr/bin/perl
ใช้อย่างเข้มงวด ;
ใช้ คำเตือน ;
ใช้ 5.34.0 ;
#เริ่มต้นตัวแปร
$n1 ของฉัน = 10 ;
$n2 ของฉัน = 25 ;
ผลลัพธ์ $ ของฉัน = 0 ;
#แยกกระบวนการปัจจุบัน
$process_id ของฉัน = ส้อม ( ) ;
#ตรวจสอบรหัสกระบวนการ
ถ้า ( $กระบวนการ_id == 0 )
{
#คำนวณการคูณตัวเลข
พูด 'กระบวนการย่อย: $$' ;
$ผลลัพธ์ = $n1 * $n2 ;
พูด “รอ 2 วินาที... \n ' ;
นอน 2 ;
พูด 'ผลคูณของ $n1 และ $n2 คือ $result' ;
}
เอลซิฟ ( $กระบวนการ_id > 0 )
{
#คำนวณผลรวมของตัวเลข
พูด 'กระบวนการหลัก: $$' ;
$ผลลัพธ์ = $n1 + $n2 ;
พูด “รอ 1 วินาที... \n ' ;
นอน 1 ;
พูด 'ผลรวมของ $n1 และ $n2 คือ $result' ;
}
อื่น
{
พูด 'ไม่สามารถแยกกระบวนการได้' ;
}
#รอดำเนินการงานให้เสร็จสิ้น
รอ ( ) ;
เอาท์พุท:
ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์ ตามผลลัพธ์ กระบวนการลูกถูกสร้างขึ้นสำเร็จ รหัสกระบวนการของกระบวนการหลักถูกพิมพ์ และสคริปต์ถูกหยุดชั่วคราวเป็นเวลา 1 วินาทีเพื่อทำงานให้เสร็จสมบูรณ์ ถัดไป ID กระบวนการของกระบวนการย่อยจะถูกพิมพ์ และสคริปต์ถูกหยุดชั่วคราวเป็นเวลา 2 วินาทีเพื่อทำงานให้เสร็จสมบูรณ์ ผลลัพธ์ของกระบวนการทั้งพาเรนต์และลูกจะถูกพิมพ์ในภายหลัง:
บทสรุป
วัตถุประสงค์ของการใช้ฟังก์ชัน Perl fork() จะแสดงอยู่ในบทช่วยสอนนี้โดยการสร้างกระบวนการลูกและดำเนินงานประเภทต่างๆ ภายในบล็อกของกระบวนการหลักและกระบวนการลูก