Perl - 进程管理

首页 / Perl入门教程 / Perl - 进程管理

您可以按照各种要求使用Perl来创建新进程。本教程将列出创建和管理Perl进程的一些重要且最常用的方法。

  • 您可以使用特殊变量 $$或 $PROCESS_ID 来获取当前的进程ID。

  • 使用上述任何方法创建的每个进程都使用%ENV 变量维护其自己的虚拟环境。

  • exit()函数始终仅退出执行该函数的子进程,除非所有正在运行的子进程都退出,否则整个主进程都不会退出。

  • 所有打开的句柄在子进程中都是dup()-ed,因此在一个进程中关闭任何句柄不会影响其他进程。

Backstick 运算符

执行任何Unix命令的最简单方法是使用backstick运算符。您只需将命令放入backstick运算符中,这将导致命令执行并返回其输出,该输出可以存储如下:

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

system() 函数

您还可以使用system函数执行任何Unix命令,该命令的输出将进入perl脚本的输出。 默认情况下它显示在屏幕中,即STDOUT,但是您可以使用重定向运算符>-将其重定向到任何文件

#!/usr/bin/perl

system( "ls -l")

1;

当执行上述代码时,它列出了当前目录中可用的所有文件和目录-

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-process-management.html

来源:LearnFk无涯教程网

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

当命令包含诸如$PATH或$HOME之类的Shell环境变量时,请当心。尝试以下三种情况-

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

当执行上述代码时,根据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

fork() 函数

Perl提供了一个 fork函数,该函数对应于同名的Unix系统调用。在大多数使用fork系统调用的类Unix平台上,Perl的fork只是对其进行调用。在某些平台上,如Windows,其中fork系统调用不可用,可以构建Perl在解释器级别上模拟fork

fork函数用于克隆当前进程。此调用将在同一点创建一个运行相同程序的新进程。它将子pid返回到父进程,将0返回到子进程,如果fork不成功,则返回undef。

您可以在进程中使用 exec函数启动请求的可执行文件,该可执行文件将在单独的进程区域中执行,exec将等待其完成,然后以与退出状态相同的退出状态退出这个过程。

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

执行上述代码后,将产生以下输出-

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

可以将 wait()waitpid作为fork()返回的伪进程ID进行传递。这些调用将适当地等待伪进程的终止并返回其状态。如果使用 waitpid函数在没有等待子进程的情况下进行分叉,则会堆积僵尸进程。在Unix系统上,可以通过将$SIG {CHLD}设置为" IGNORE"来避免这种情况,如下所示:

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

执行上述代码后,将产生以下输出-

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

kill() 函数

Perl kill('KILL',(Process List))函数可用于通过将fork返回的ID传递给伪进程来终止它。

请注意,在伪进程()上使用kill('KILL',(Process List))通常可能会导致内存泄漏,因为实现伪进程的线程没有机会清理其资源。

您可以使用 kill()函数向目标进程发送任何其他信号,如下面的操作会将SIGINT发送给进程ID 104和102-

#!/usr/bin/perl

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

软件工程之美 -〔宝玉〕

Vue开发实战 -〔唐金州〕

OpenResty从入门到实战 -〔温铭〕

MySQL 必知必会 -〔朱晓峰〕

攻克视频技术 -〔李江〕

李智慧 · 高并发架构实战课 -〔李智慧〕

Kubernetes入门实战课 -〔罗剑锋〕

大厂设计进阶实战课 -〔小乔〕

结构思考力 · 透过结构看思考 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)