如何在父进程终止/结束时(在窗口中)保持子进程处于活动状态



我实际上正在创建一个脚本,其中fork()创建一个在后台运行的子进程,并使用其进程ID检查在前台运行的主脚本(父进程(的时间段。如果主脚本(母进程(超过阈值时间,则将采取操作/s。

在Linux中,它之所以得以实现,是因为INIT进程在主脚本(父进程(终止或完成后成为活动子进程(孤立进程(的父进程。

但是,我无法在Windows中实现它,因为父子架构与Linux不同

Perl语言下相同(在Linux中(的短代码是:

sub run_sleep { 
my $pid = fork();  ## Here, $pid var. will have child process PID for parent, and value 0 for child process
return if $pid;     # returns to the parent process( out of function)   
print "Running child processn";   # Proceeds for the child process
select undef, undef, undef, $initial_time_wait ;
if ( kill 0, $Parent_ID ) {    ##Here, $Parent_ID is main script id (parent process id)
print "Parent process $Parent_ID_or_script_id still existsn";
}
else {
print "Parent process $Parent_ID_or_script_id must have completed";
exit 0;
}
print "Done with child processn";
exit 0;  # end child process
}

如何在Windows中实现此功能?

Windows不提供分叉机制。Perl使用线程提供了有限的模拟。由于没有创建子进程,因此没有可以保持活动的子进程。

您可能可以使用以下内容(但您需要将任何相关状态传达给子级,因为它不是父级的副本(:

if (@ARGV && $ARGV[0] eq "!fork!") {
shift(@ARGV);
child();
exit;
}
...
my $pid;
if ($^O eq 'Win32')  {
$pid = system(-1, $^X, '--', $0, "!fork!", ...args...);
} else {
...
}
  1. 在Windows中,当您杀死父进程时,它的子进程也会被杀死。(不像Linux,在杀死父级之后,子级会得到新的父级-PID为1的INIT(
  2. 在窗口中,如果子进程仍在运行,则父进程也不会自动退出(父进程PID将存在(。(针对您的问题(

因此,解决方案是添加一个步骤,在该步骤中,在主脚本结束之前,将杀死子PID;因此,当孩子被杀死时,父母也可以成功退出。

因此,如果主脚本在阈值时间之前完成,则意味着子脚本不需要任何操作(而且,子脚本将在主脚本完成之前被杀死(。如果主脚本超过阈值,子脚本将发送邮件。当主脚本即将结束时,child将首先被杀死,并且主脚本可以成功退出。

最新更新