Perl - Manajemen Proses

Anda dapat menggunakan Perl dengan berbagai cara untuk membuat proses baru sesuai kebutuhan Anda. Tutorial ini akan mencantumkan beberapa metode penting dan paling sering digunakan untuk membuat dan mengelola proses Perl.

  • Anda dapat menggunakan variabel khusus $$ atau $PROCESS_ID untuk mendapatkan ID proses saat ini.

  • Setiap proses yang dibuat menggunakan salah satu metode yang disebutkan, memelihara lingkungan virtualnya sendiri dengan-in %ENV variabel.

  • Itu exit() fungsi selalu keluar hanya proses anak yang menjalankan fungsi ini dan proses utama secara keseluruhan tidak akan keluar kecuali semua proses anak yang berjalan telah keluar.

  • Semua pegangan terbuka adalah dup () - ed dalam proses anak, sehingga menutup pegangan apapun dalam satu proses tidak mempengaruhi proses lainnya.

Operator Backstick

Cara termudah untuk menjalankan perintah Unix adalah dengan menggunakan operator backstick. Anda cukup meletakkan perintah Anda di dalam operator backstick, yang akan menghasilkan eksekusi perintah dan mengembalikan hasilnya yang dapat disimpan sebagai berikut -

#!/usr/bin/perl

@files = `ls -l`;

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

1;

Ketika kode di atas dijalankan, itu mendaftar semua file dan direktori yang tersedia di direktori saat ini -

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
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy

Fungsi system ()

Anda juga bisa menggunakan system()berfungsi untuk menjalankan perintah Unix apa pun, yang hasilnya akan dikirim ke keluaran skrip perl. Secara default, ini adalah layar, yaitu STDOUT, tetapi Anda dapat mengarahkannya ke file apa pun dengan menggunakan operator redirection> -

#!/usr/bin/perl

system( "ls -l")

1;

Ketika kode di atas dijalankan, itu mendaftar semua file dan direktori yang tersedia di direktori saat ini -

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
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy

Hati-hati ketika perintah Anda berisi variabel lingkungan shell seperti $ PATH atau $ HOME. Coba ikuti tiga skenario -

#!/usr/bin/perl

$PATH = "I am Perl Variable";

system('echo $PATH');  # Treats $PATH as shell variable
system("echo $PATH");  # Treats $PATH as Perl variable
system("echo \$PATH"); # Escaping $ works.

1;

Ketika kode di atas dijalankan, ini menghasilkan hasil berikut tergantung pada apa yang diatur dalam variabel shell $ PATH.

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

Fungsi garpu ()

Perl menyediakan fork()fungsi yang sesuai dengan panggilan sistem Unix dengan nama yang sama. Pada sebagian besar platform mirip Unix di mana pemanggilan sistem fork () tersedia, Perl's fork () hanya memanggilnya. Pada beberapa platform seperti Windows di mana pemanggilan sistem fork () tidak tersedia, Perl dapat dibangun untuk meniru fork () pada level interpreter.

Fungsi fork () digunakan untuk mengkloning proses saat ini. Panggilan ini membuat proses baru yang menjalankan program yang sama pada titik yang sama. Ia mengembalikan pid anak ke proses induk, 0 ke proses anak, atau undef jika garpu tidak berhasil.

Kamu dapat memakai exec() berfungsi dalam proses untuk meluncurkan eksekusi yang diminta, yang akan dijalankan di area proses terpisah dan exec () akan menunggu hingga selesai sebelum keluar dengan status keluar yang sama seperti proses itu.

#!/usr/bin/perl

if(!defined($pid = fork())) {
   # fork returned undef, so unsuccessful
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!";
  
} else {
   # fork returned 0 nor undef
   # so this branch is parent
   print "Printed by parent process\n";
   $ret = waitpid($pid, 0);
   print "Completed process id: $ret\n";

}

1;

Ketika kode di atas dijalankan, itu menghasilkan hasil sebagai berikut -

Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777

Itu wait() dan waitpid()bisa dikirimkan sebagai ID proses semu yang dikembalikan oleh fork (). Panggilan ini akan menunggu dengan baik penghentian proses semu dan mengembalikan statusnya. Jika Anda bercabang tanpa pernah menunggu anak Anda menggunakanwaitpid()fungsi, Anda akan mengumpulkan zombie. Pada sistem Unix, Anda dapat menghindari ini dengan menyetel $ SIG {CHLD} menjadi "IGNORE" sebagai berikut -

#!/usr/bin/perl

local $SIG{CHLD} = "IGNORE";
 
if(!defined($pid = fork())) {
   # fork returned undef, so unsuccessful
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!";
  
} else {
   # fork returned 0 nor undef
   # so this branch is parent
   print "Printed by parent process\n";
   $ret = waitpid($pid, 0);
   print "Completed process id: $ret\n";

}

1;

Ketika kode di atas dijalankan, itu menghasilkan hasil sebagai berikut -

Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1

Fungsi kill ()

Perl kill('KILL', (Process List)) function bisa digunakan untuk menghentikan proses semu dengan meneruskan ID yang dikembalikan oleh fork ().

Perhatikan bahwa menggunakan kill ('KILL', (Process List)) pada pseudo-process () biasanya dapat menyebabkan kebocoran memori, karena thread yang mengimplementasikan pseudo-process tidak mendapatkan kesempatan untuk membersihkan resource-nya.

Kamu dapat memakai kill() berfungsi untuk mengirim sinyal lain ke proses target, misalnya berikut ini akan mengirim SIGINT ke ID proses 104 dan 102 -

#!/usr/bin/perl

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