Perl - Süreç Yönetimi

Gereksinimlerinize göre yeni süreçler oluşturmak için Perl'i çeşitli şekillerde kullanabilirsiniz. Bu eğitici, Perl süreçlerini oluşturmak ve yönetmek için birkaç önemli ve en sık kullanılan yöntemleri listeleyecektir.

  • Özel değişkenler kullanabilirsiniz $$ veya $PROCESS_ID mevcut işlem kimliğini almak için.

  • Bahsedilen yöntemlerden herhangi biri kullanılarak oluşturulan her işlem, kendi sanal ortamını içinde barındırır. %ENV değişken.

  • exit() işlev her zaman sadece bu işlevi yürüten alt süreçten çıkar ve bir bütün olarak ana süreç, çalışan tüm alt süreçler çıkmadıkça çıkmaz.

  • Tüm açık tutamaçlar alt süreçlerde çift () tutulur, böylece bir işlemdeki herhangi bir tutamaçların kapatılması diğerlerini etkilemez.

Backstick Operatörü

Herhangi bir Unix komutunu çalıştırmanın bu en basit yolu backstick operatörü kullanmaktır. Komutunuzu basitçe backstick operatörünün içine koyarsınız, bu da komutun yürütülmesine neden olur ve aşağıdaki gibi kaydedilebilen sonucunu döndürür -

#!/usr/bin/perl

@files = `ls -l`;

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

1;

Yukarıdaki kod yürütüldüğünde, geçerli dizinde bulunan tüm dosyaları ve dizinleri listeler -

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

System () Fonksiyonu

Ayrıca kullanabilirsin system()Çıktısı perl betiğinin çıktısına gidecek olan herhangi bir Unix komutunu yürütmek için işlev. Varsayılan olarak ekrandır, yani STDOUT, ancak yeniden yönlendirme operatörünü kullanarak herhangi bir dosyaya yeniden yönlendirebilirsiniz> -

#!/usr/bin/perl

system( "ls -l")

1;

Yukarıdaki kod yürütüldüğünde, geçerli dizinde bulunan tüm dosyaları ve dizinleri listeler -

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

Komutunuz $ PATH veya $ HOME gibi kabuk çevresel değişkenleri içerdiğinde dikkatli olun. Üç senaryoyu takip etmeyi deneyin -

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

Yukarıdaki kod çalıştırıldığında, $ PATH kabuk değişkeninde neyin ayarlandığına bağlı olarak aşağıdaki sonucu verir.

/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

Fork () Fonksiyonu

Perl, bir fork()aynı adlı Unix sistem çağrısına karşılık gelen işlev. Fork () sistem çağrısının mevcut olduğu çoğu Unix benzeri platformda, Perl'in fork () basitçe onu çağırır. Fork () sistem çağrısının bulunmadığı Windows gibi bazı platformlarda, yorumlayıcı düzeyinde fork () benzetimi yapmak için Perl oluşturulabilir.

Fork () işlevi, mevcut bir işlemi klonlamak için kullanılır. Bu çağrı, aynı programı aynı noktada çalıştıran yeni bir işlem yaratır. Çocuk pid'i üst sürece, 0'ı alt sürece veya çatal başarısız olursa undef'e döndürür.

Kullanabilirsiniz exec() ayrı bir işlem alanında yürütülecek ve exec () bu işlemle aynı çıkış durumuyla çıkmadan önce tamamlanmasını bekleyecek olan istenen yürütülebilir dosyayı başlatmak için bir işlem içinde işlev görür.

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

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

wait() ve waitpid()fork () tarafından döndürülen sözde işlem kimliği olarak aktarılabilir. Bu çağrılar, sözde sürecin sona ermesini doğru bir şekilde bekleyecek ve durumuna dönecektir. Çocuklarınızın kullanmasını beklemeden çatal yaparsanızwaitpid()işlevi, zombileri biriktireceksiniz. Unix sistemlerinde $ SIG {CHLD} 'yi aşağıdaki gibi "IGNORE" olarak ayarlayarak bunu önleyebilirsiniz -

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

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Kill () İşlevi

Perl kill('KILL', (Process List)) işlev, fork () tarafından döndürülen kimliği ileterek sözde süreci sonlandırmak için kullanılabilir.

Bir sözde işlemde () kill ('KILL', (İşlem Listesi)) kullanmanın tipik olarak bellek sızıntılarına neden olabileceğini unutmayın, çünkü sözde işlemi uygulayan iş parçacığının kaynaklarını temizleme şansı yoktur.

Kullanabilirsiniz kill() hedef süreçlere başka herhangi bir sinyal gönderme işlevi, örneğin aşağıdaki SIGINT'i bir işlem kimliği 104 ve 102'ye gönderir -

#!/usr/bin/perl

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