คุณสามารถสร้างกระบวนการได้หลายวิธีใน Perl
บทช่วยสอนนี้จะกล่าวถึงวิธีการจัดการกระบวนการบางอย่าง
คุณสามารถรับ ID กระบวนการได้โดยใช้ตัวแปรพิเศษ $$ หรือ $PROCESS_ID
แฮช %ENV เก็บตัวแปรสภาพแวดล้อมไว้ในกระบวนการหลัก ซึ่งก็คือตัวแปรเหล่านี้สามารถแก้ไขได้ในภาษา Perl
exit() มักจะใช้เพื่อออกจากกระบวนการย่อย หลังจากออกจากกระบวนการหลักแล้ว
หมายเลขอ้างอิงที่เปิดอยู่ทั้งหมดจะถูกคัดลอกโดยฟังก์ชัน dup() ในรูทีนย่อย และหมายเลขอ้างอิงทั้งหมดที่ปิดโดยกระบวนการจะไม่ส่งผลกระทบต่อกระบวนการอื่น ๆ
คำสั่ง Unix สามารถดำเนินการได้อย่างง่ายดายโดยใช้ตัวดำเนินการ backtick คุณสามารถแทรกคำสั่งง่ายๆ ลงใน backticks ได้ หลังจากดำเนินการคำสั่งแล้ว ผลลัพธ์จะถูกส่งกลับ:
#!/usr/bin/perl@files = `ls -l`;foreach $file (@files){ พิมพ์ $file;}1;
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์จะเป็นดังนี้:
drwxr-xr-x 3 รูท รูท 4096 14 ก.ย. 06:46 9-14drwxr-xr-x 4 รูท รูท 4096 13 ก.ย. 07:54 android-rw-r--r-- 1 รูทรูท 574 17 ก.ย. 15:16 ดัชนี .htmdrwxr-xr-x 3 544 401 4096 6 ก.ค. 16:49 MIME-Lite-3.01-rw-r --- r-- 1 รูทรูท 71 ก.ย. 17 15:16 test.pl……
คุณยังสามารถใช้ฟังก์ชัน system() เพื่อรันคำสั่ง Unix การดำเนินการคำสั่งนี้จะแสดงผลผลลัพธ์โดยตรง ตามค่าเริ่มต้น มันจะถูกส่งไปยังตำแหน่งที่ STDOUT ของ Perl ชี้อยู่ ซึ่งโดยปกติจะเป็นหน้าจอ คุณยังสามารถใช้ตัวดำเนินการเปลี่ยนเส้นทาง > เพื่อส่งออกไปยังไฟล์เฉพาะ:
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์จะเป็นดังนี้:
drwxr-xr-x 3 รูท รูท 4096 14 ก.ย. 06:46 9-14drwxr-xr-x 4 รูท รูท 4096 13 ก.ย. 07:54 android-rw-r--r-- 1 รูทรูท 574 17 ก.ย. 15:16 ดัชนี .htmdrwxr-xr-x 3 544 401 4096 6 ก.ค. 16:49 MIME-Lite-3.01-rw-r --- r-- 1 รูทรูท 71 ก.ย. 17 15:16 test.pl……
คุณต้องใส่ใจกับผลลัพธ์ของคำสั่งรวมถึงตัวแปรสภาพแวดล้อม เช่น $PATH หรือ $HOME ดังที่แสดงด้านล่าง:
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์จะเป็นดังนี้:
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinฉันเป็นตัวแปร Perl /usr/local/bin:/bin:/usr/bin:/ usr /local/sbin:/usr/sbin:/sbin
ฟังก์ชัน Perl fork() ใช้เพื่อสร้างกระบวนการใหม่
ส่งกลับ PID ของกระบวนการลูกในกระบวนการหลัก และ 0 ในกระบวนการลูก หากมีข้อผิดพลาดเกิดขึ้น (เช่น หน่วยความจำไม่เพียงพอ) undef จะถูกส่งกลับ และ $! จะถูกตั้งค่าเป็นข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง
fork สามารถใช้ร่วมกับ exec ได้ กระบวนการสิ้นสุดหลังจากที่ฟังก์ชัน exec ดำเนินการคำสั่งด้วยเครื่องหมายคำพูด
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์จะเป็นดังนี้:
เอาท์พุตผ่านกระบวนการหลัก เอาท์พุตผ่านกระบวนการลูก รหัสกระบวนการเสร็จสมบูรณ์ในวันอาทิตย์ที่ 19 มิถุนายน 2559 22:21:14 รหัสกระบวนการ CST: 47117
หากกระบวนการออก กระบวนการจะส่งสัญญาณ CHLD ไปยังกระบวนการหลัก และจะกลายเป็นกระบวนการซอมบี้ กระบวนการหลักจำเป็นต้องใช้ wait และ waitpid เพื่อยุติกระบวนการ แน่นอน คุณยังสามารถตั้งค่า $SIG{CHLD} เป็น IGNORG ได้:
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์จะเป็นดังนี้:
เอาท์พุตผ่านกระบวนการหลัก เอาท์พุตผ่านกระบวนการลูก รหัสกระบวนการเสร็จสมบูรณ์ในวันอาทิตย์ที่ 19 มิถุนายน 2559 22:30:56 รหัสกระบวนการ CST: -1
Perl kill('signal', (Process List)) ส่งสัญญาณไปยังกลุ่มของกระบวนการ สัญญาณคือสัญญาณดิจิตอลที่ส่ง 9 คือการฆ่ากระบวนการ
ก่อนอื่น มาดูสัญญาณที่ใช้กันทั่วไปใน Linux ดูรายการต่อไปนี้:
คำอธิบายชื่อสัญญาณและคำอธิบายประกอบค่า———————————————————————————————— ——————————— ———HUP 1 A ตรวจพบการค้าง INT 2 A การขัดจังหวะจากแป้นพิมพ์ QUIT 3 A หยุดจากแป้นพิมพ์ ILL 4 A คำสั่งไม่ถูกต้อง ABRT 6 C ความล้มเหลว FPE 8 C จุดลอยตัว ผิดปกติ KILL 9 สัญญาณเทอร์มินัล AF USR1 10 A สัญญาณที่ผู้ใช้กำหนด 1SEGV 11 C การเข้าถึงหน่วยความจำไม่ถูกต้อง USR2 12 A สัญญาณที่ผู้ใช้กำหนด 2PIPE 13 A เขียนไปยังไปป์ ALRM ที่ไม่มีตัวอ่าน 14 A สัญญาณตั้งเวลา TERM จากนาฬิกาปลุก 15 A สัญญาณเทอร์มินัล CHLD 17 B การยกเลิกกระบวนการลูก CONT 18 E ดำเนินการต่อ หยุดหากหยุด 19 DF หยุดกระบวนการ TSTP 20 D พิมพ์คำสั่งหยุด TTIN บน tty 21 D พิมพ์ TTOU บน tty ของกระบวนการเบื้องหลัง 22 D tty ส่งออกไปยังกระบวนการเบื้องหลัง
ตัวอย่างต่อไปนี้ส่งสัญญาณ SIGINT ไปยังกระบวนการ 104 และ 102: