ฟังก์ชัน Perl Fork

Fangkchan Perl Fork



fork() เป็นฟังก์ชันในตัวของ Perl ที่ใช้เพื่อสร้างกระบวนการย่อยของกระบวนการที่ทำงานอยู่ และใช้งานได้บนระบบปฏิบัติการ Linux เท่านั้น โดยจะสร้างสำเนาแยกต่างหากของกระบวนการดำเนินการและรันทั้งสองกระบวนการพร้อมกัน ดังนั้น หากมีการอัพเดตตัวแปรของกระบวนการพาเรนต์ ก็จะไม่มีผลกระทบใดๆ ต่อตัวแปรเดียวกันของกระบวนการลูกหรือในทางกลับกัน การใช้ฟังก์ชัน fork() ใน Perl จะแสดงอยู่ในบทช่วยสอนนี้

ไวยากรณ์:

ไวยากรณ์ของฟังก์ชัน 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' นั่นคือค่าหลังทางแยก:





  หน้า 1

ตัวอย่างที่ 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 วินาทีเพื่อทำงานให้เสร็จสมบูรณ์ ผลลัพธ์ของกระบวนการทั้งพาเรนต์และลูกจะถูกพิมพ์ในภายหลัง:

  หน้า 2

บทสรุป

วัตถุประสงค์ของการใช้ฟังก์ชัน Perl fork() จะแสดงอยู่ในบทช่วยสอนนี้โดยการสร้างกระบวนการลูกและดำเนินงานประเภทต่างๆ ภายในบล็อกของกระบวนการหลักและกระบวนการลูก