การจัดการกระบวนการ Perl
Perl คุณสามารถในรูปแบบที่แตกต่างกันในการสร้างกระบวนการ
กวดวิชานี้จะหารือเกี่ยวกับการจัดการกระบวนการบางอย่าง
คุณสามารถใช้ตัวแปรพิเศษ$$ หรือ $ PROCESS_IDที่จะได้รับกระบวนการ ID
ENV% กัญชาถือการปกครองซึ่งเป็นตัวแปรสภาพแวดล้อมเปลือกใน Perl สามารถแก้ไขตัวแปรเหล่านี้
ออก () มักจะใช้เพื่อออกจากกระบวนการเด็กกระบวนการเด็กออกจากกระบวนการหลักออกหลังจากทั้งหมด
ทั้งหมดที่จับเปิด dup ใน subroutine () ฟังก์ชันเพื่อคัดลอกทั้งหมดปิดทั้งหมดจัดการกระบวนการจะไม่ส่งผลกระทบต่อกระบวนการอื่น ๆ
ผู้ประกอบการ backtick
ใช้ประกอบการ backquote สามารถรันคำสั่ง Unix คุณสามารถแทรกคำสั่งง่ายๆบางอย่างในการต่อต้านคำพูด เรียกคำสั่งจะทำการแสดงผล:
#!/usr/bin/perl @files = `ls -l`; foreach $file (@files){ print $file; } 1;
โปรแกรมข้างต้นออกผลมีดังนี้:
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14 drwxr-xr-x 4 root root 4096 Sep 13 07:54 android -rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01 -rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl ……
ระบบ () ฟังก์ชัน
นอกจากนี้คุณยังสามารถใช้ระบบ () ฟังก์ชันรันคำสั่ง Unix คำสั่งจะถูกดำเนินการส่งออกโดยตรงโดยค่าเริ่มต้นในปัจจุบันจะถูกส่งไปยังจุด STDOUT ของ Perl ที่มักจะหน้าจอ นอกจากนี้คุณยังสามารถใช้ประกอบการเปลี่ยนเส้นทาง> ส่งออกไปยังแฟ้มที่ระบุ:
โปรแกรมข้างต้นออกผลมีดังนี้:
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14 drwxr-xr-x 4 root root 4096 Sep 13 07:54 android -rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01 -rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl ……
โปรดทราบว่าคำสั่งที่คุณจำเป็นต้องมีตัวแปรสภาพแวดล้อมเช่นการส่งออกหรือ $ HOME $ PATH ดังนี้
#!/usr/bin/perl $PATH = "我是 Perl 的变量"; system('echo $PATH'); # $PATH 作为 shell 环境变量 system("echo $PATH"); # $PATH 作为 Perl 的变量 system("echo \$PATH"); # 转义 $ 1;
โปรแกรมข้างต้นออกผลมีดังนี้:
/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 () ฟังก์ชั่นที่ใช้ในการสร้างกระบวนการใหม่
ผลตอบแทนที่เด็กใน PID การปกครองในกระบวนการเด็กกลับ 0 หากมีข้อผิดพลาด (เช่นออกจากหน่วยความจำ) ที่เกิดขึ้นผลตอบแทน undef และ $! ถูกตั้งค่าเป็นข้อผิดพลาดที่สอดคล้องกัน
มันสามารถนำมาใช้ร่วมกับส้อมและ exec ขั้นตอนการดำเนินการฟังก์ชั่น exec ว่าจะเสร็จสมบูรณ์หลังจากการสิ้นสุดของคำสั่งภายในเครื่องหมายอัญประกาศ
#!/usr/bin/perl if(!defined($pid = fork())) { # fork 发生错误返回 undef die "无法创建子进程: $!"; }elsif ($pid == 0) { print "通过子进程输出\n"; exec("date") || die "无法输出日期: $!"; } else { # 在父进程中 print "通过父进程输出\n"; $ret = waitpid($pid, 0); print "完成的进程ID: $ret\n"; } 1;
โปรแกรมข้างต้นออกผลมีดังนี้:
通过父进程输出 通过子进程输出 2016年 6月19日 星期日 22时21分14秒 CST 完成的进程ID: 47117
ถ้าออกจากกระบวนการก็จะส่งสัญญาณไปยังการปกครองหลังจาก CHLD ก็จะกลายเป็นกระบวนการที่ตายแล้วที่ต้องรอการปกครองและ waitpid ยกเลิก แน่นอนคุณยังสามารถตั้งค่า $ SIG {} เพื่อ CHLD IGNORG:
#!/usr/bin/perl local $SIG{CHLD} = "IGNORE"; if(!defined($pid = fork())) { # fork 发生错误返回 undef die "无法创建子进程: $!"; }elsif ($pid == 0) { print "通过子进程输出\n"; exec("date") || die "无法输出日期: $!"; } else { # 在父进程中 print "通过父进程输出\n"; $ret = waitpid($pid, 0); print "完成的进程ID: $ret\n"; } 1;
โปรแกรมข้างต้นออกผลมีดังนี้:
通过父进程输出 通过子进程输出 2016年 6月19日 星期日 22时30分56秒 CST 完成的进程ID: -1
ฟังก์ชั่นฆ่า
Perl ฆ่า ( 'สัญญาณ' ( รายการกระบวนการ)) ส่งสัญญาณไปยังกลุ่มของกระบวนการสัญญาณเป็นสัญญาณดิจิตอลส่ง 9 ที่จะฆ่ากระบวนการ
ดูครั้งแรกที่ลินุกซ์ที่ใช้กันทั่วไปสัญญาณดูรายชื่อดังต่อไปนี้:
信号名 值 标注 解释 ———————————————————————————————————————————————————————————— HUP 1 A 检测到挂起 INT 2 A 来自键盘的中断 QUIT 3 A 来自键盘的停止 ILL 4 A 非法指令 ABRT 6 C 失败 FPE 8 C 浮点异常 KILL 9 AF 终端信号 USR1 10 A 用户定义的信号1 SEGV 11 C 非法内存访问 USR2 12 A 用户定义的信号2 PIPE 13 A 写往没有读取者的管道 ALRM 14 A 来自闹钟的定时器信号 TERM 15 A 终端信号 CHLD 17 B 子进程终止 CONT 18 E 如果被停止则继续 STOP 19 DF 停止进程 TSTP 20 D tty键入的停止命令 TTIN 21 D 对后台进程的tty输入 TTOU 22 D 对后台进程的tty输出
ตัวอย่างต่อไปนี้จะประมวลผล 104 และ 102 จะส่งสัญญาณ SIGINT:
#!/usr/bin/perl kill('INT', 104, 102); 1;