当前位置: 首页 > 编程笔记 >

Perl中的fork()函数

张鸿志
2023-03-14
本文向大家介绍Perl中的fork()函数,包括了Perl中的fork()函数的使用技巧和注意事项,需要的朋友参考一下

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

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

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

示例

#!/usr/bin/perl
if(!defined($pid = fork())) {
   #fork返回了undef,所以没有成功
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!";
} else {
   #fork返回0或undef
   #所以这个分支是父级的
   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()作为由返回的伪进程ID进行传递fork()。这些调用将正确地等待伪进程的终止并返回其状态。如果您使用waitpid()函数在没有等待孩子的情况下进行分叉,则会堆积僵尸。在Unix系统上,可以通过将$SIG {CHLD}设置为“ IGNORE”来避免这种情况,如下所示:

示例

#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE";
if(!defined($pid = fork())) {
   #fork返回了undef,所以没有成功
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!";
} else {
   #fork返回0或undef
   #所以这个分支是父级的
   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
 类似资料:
  • 本文向大家介绍Perl中的system()函数,包括了Perl中的system()函数的使用技巧和注意事项,需要的朋友参考一下 您可以使用 system() Perl函数来执行任何Unix命令,该命令的输出将进入perl脚本的输出。默认情况下,它是屏幕,即STDOUT,但是您可以使用重定向操作符将其重定向到任何文件>- 当执行上述代码时,它列出了当前目录中所有可用的文件和目录- 当命令包含诸如$P

  • 本文向大家介绍Perl中的kill()函数,包括了Perl中的kill()函数的使用技巧和注意事项,需要的朋友参考一下 Perl kill('KILL', (Process List))函数可用于通过将fork()返回的ID传递给伪进程来终止它。 注意,在伪进程上使用kill(' kill ',(进程列表))通常会导致内存泄漏,因为实现伪进程的线程没有机会清理其资源。 可以使用kill()函数向目

  • 本文向大家介绍Perl中有用的DBI函数,包括了Perl中有用的DBI函数的使用技巧和注意事项,需要的朋友参考一下 检查available_drivers 通过@INC中的目录搜索DBD::*模块,返回所有可用驱动程序的列表。默认情况下,如果某些驱动程序被较早目录中的其他同名驱动程序隐藏,则会发出警告。为$quiet传递真实值将禁止该警告。 检查installed_drivers 返回所有已“安装

  • 本文向大家介绍Linux中fork()函数实例分析,包括了Linux中fork()函数实例分析的使用技巧和注意事项,需要的朋友参考一下 一、fork 入门知识  一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。  一个进程调用fork()函数后

  • 问题内容: 我有一些需要在Java中转置的Perl代码。在此代码中,我必须处理Perl的。Java中是否有等效功能?Perl代码如下所示: 问题答案: Perl的/ 函数是一种用途广泛的转换实用程序,具有其自己的格式语法(在此使用,它使输入任意长的十六进制字符串作为输入)在Java世界中没有直接等效的语法。但是,翻译… …对于Java,您可以例如使用: 有关更多信息,请阅读Javadocs中的类参

  • 本文向大家介绍Python多进程fork()函数详解,包括了Python多进程fork()函数详解的使用技巧和注意事项,需要的朋友参考一下 进程 进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。进程是系统进行资源分配和调度的一个独立单位。进程是由代码(堆栈段)、数据(数据段)、内核状态和一组寄存器组成。 在多任务操作系统中,通过运行多个进程来并发地执行多个任务。由于