gpt4 book ai didi

linux - perl fork() exec() ,子进程疯狂

转载 作者:IT王子 更新时间:2023-10-29 00:56:01 26 4
gpt4 key购买 nike

我正在使用 Linux 并且 .shtcsh 中。

我做了一个非常基础的 forkexec ,但我需要帮助实现安全措施。

基本上我的 perl 脚本在子进程中调用 .sh 脚本。但是当我用 Ctrl+c 杀死父进程时,信号被子进程忽略了。

1) 如何同时为子进程捕获 SIGINT

2) 运行 .sh 脚本的子进程仍然 STDOUT 到 xterm 的屏幕。我怎样才能删除它?我正在考虑在后台运行脚本

 exec("shell.sh args &");  

但还没有测试,因为我需要先弄清楚如何让 child 不发疯。

3) 父进程(perl 脚本)不等待子进程(.sh 脚本)。所以我读了很多关于 child 变成僵尸的文章???脚本完成后会发生吗?我该如何阻止它?

$pid = fork();
if($pid < 0){
print "Failed to fork process... Exiting";
exit(-1);
}
elsif ($pid ==0) {
#child process
exec("shell.sh args");
exit(1);
}
else { #execute rest of parent}

最佳答案

But when I do ctrl+c to kill the parent, the signal gets ignored by the child.

信号被发送给 parent 和 child 两个。

$ perl -E'
if (my $pid = fork()) {
local $SIG{INT} = sub { say "Parent got SIGINT" };
sleep;
waitpid($pid, 0);
} else {
local $SIG{INT} = sub { say "Child got SIGINT" };
sleep;
}
'
^CParent got SIGINT
Child got SIGINT

如果那个 child 忽略了它,那是因为它开始了一个新的 session 或者因为它明确地忽略了它。

The child procces that runs the .sh script still STDOUT to the screen of the xterm. How can I remove this?

在调用 exec 之前在 child 中执行以下操作:

open(STDOUT, '>', '/dev/null');
open(STDERR, '>', '/dev/null');

实际上,我会使用 open3进行一些错误检查。

open(local *CHILD_STDIN,  '<', '/dev/null') or die $!;
open(local *CHILD_STDOUT, '>', '/dev/null') or die $!;
my $pid = open3(
'<&CHILD_STDIN',
'>&CHILD_STDOUT',
'>&CHILD_STDOUT',
'shell.sh', 'args',
);

The parent process(perl script) doesn't wait on the child(.sh script). So I've read alot about the child becoming a zombie???

当父级退出时,或者如果他们在父级退出后退出,子级将自动收割。

$ perl -e'
for (1..3) {
exec(perl => (-e => 1)) if !fork;
}
sleep 1;
system("ps");
' ; ps
PID TTY TIME CMD
26683 pts/13 00:00:00 bash
26775 pts/13 00:00:00 perl
26776 pts/13 00:00:00 perl <defunct> <-- zombie
26777 pts/13 00:00:00 perl <defunct> <-- zombie
26778 pts/13 00:00:00 perl <defunct> <-- zombie
26779 pts/13 00:00:00 ps
PID TTY TIME CMD
26683 pts/13 00:00:00 bash
26780 pts/13 00:00:00 ps
<-- all gone

如果 parent 先于 child 退出,那没有问题。

如果父项在子项退出后不久就退出,则没有问题。

如果父项在子项退出很长时间后退出,您将想要收割它们。您可以使用 waitwaitpid(可能来自 SIGCHLD 处理程序)执行此操作,或者您可以使用 自动获取它们$SIG{CHLD} = '忽略';。参见 perlipc .

关于linux - perl fork() exec() ,子进程疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com