Pengurusan proses Perl


Anda boleh mencipta proses dengan cara yang berbeza dalam Perl.

Tutorial ini akan membincangkan beberapa kaedah pengurusan proses.

  • Anda boleh menggunakan pembolehubah khas $$ atau $PROCESS_ID untuk mendapatkan ID proses.

  • %ENV cincangan menyimpan proses induk, iaitu pembolehubah persekitaran dalam cangkerang Pembolehubah ini boleh diubah suai dalam Perl.

  • exit() biasanya digunakan untuk keluar dari proses anak Proses utama akan keluar selepas semua proses anak telah keluar.

  • Semua pemegang terbuka akan disalin oleh fungsi dup() dalam subrutin dan menutup semua pemegang proses tidak akan menjejaskan proses lain.


Operator Backtick

Menggunakan operator backtick memudahkan untuk melaksanakan arahan Unix. Anda boleh memasukkan beberapa arahan mudah dalam backtick. Selepas arahan dilaksanakan, hasilnya akan dikembalikan:

#!/usr/bin/perl

@files = `ls -l`;

foreach $file (@files){
   print $file;
}

1;

Jalankan atur cara di atas dan hasil output akan seperti berikut:

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
……

fungsi system()

Anda juga boleh menggunakan sistem () Fungsi melaksanakan perintah Unix Melaksanakan arahan ini akan mengeluarkan hasil secara langsung. Secara lalai, ia akan dihantar ke tempat STDOUT Perl pada masa ini menunjuk, yang biasanya skrin. Anda juga boleh menggunakan operator ubah hala> untuk mengeluarkan ke fail yang ditentukan:

Laksanakan program di atas, hasil output adalah seperti berikut:

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
……

Anda perlu ambil perhatian bahawa arahan itu mengandungi pembolehubah persekitaran seperti $PATH atau $HOME Hasil output adalah seperti berikut:

#!/usr/bin/perl

$PATH = "我是 Perl 的变量";

system('echo $PATH');  # $PATH 作为 shell 环境变量
system("echo $PATH");  # $PATH 作为 Perl 的变量
system("echo $PATH"); # 转义 $

1;

Laksanakan program di atas dan hasil output adalah seperti berikut:

/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

fungsi fork()

Fungsi Perl fork() digunakan untuk mencipta proses baharu.

Mengembalikan PID proses anak dalam proses induk dan mengembalikan 0 dalam proses anak. Jika ralat berlaku (contohnya, memori tidak mencukupi), undef dikembalikan dan $!

garpu boleh digunakan dengan exec. Proses ini tamat selepas fungsi exec melaksanakan arahan dalam petikan.

#!/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;

Laksanakan program di atas, hasil output adalah seperti berikut:

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时21分14秒 CST
完成的进程ID: 47117

Jika proses keluar, ia akan menghantar isyarat CHLD kepada proses induk, dan ia akan menjadi proses zombie, memerlukan proses induk menggunakan wait dan waitpid untuk ditamatkan. Sudah tentu, anda juga boleh menetapkan $SIG{CHLD} kepada 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;

Laksanakan program di atas, hasil output adalah seperti berikut:

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时30分56秒 CST
完成的进程ID: -1

Fungsi Kill

Perl kill('signal', (Senarai Proses))Menghantar isyarat kepada sekumpulan proses. isyarat adalah isyarat digital yang dihantar, 9 adalah untuk membunuh proses.

Mula-mula, mari kita lihat isyarat yang biasa digunakan di Linux, lihat senarai berikut:

信号名          值          标注          解释
————————————————————————————————————————————————————————————
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输出

Contoh berikut menghantar isyarat SIGINT ke proses 104 dan 102:

#!/usr/bin/perl

kill('INT', 104, 102);
 
1;