- 论坛徽章:
- 0
|
代码如下简写如下:- $| = 1;
- open FL,'>>','/tmp/log' or die "$!\n";
- my $fork_retry = 0;
- if ((my $pid = fork)) {
- $SIG{TERM} = sub { kill(9,-$) }; //父进程接受到TERM信号 则kill掉进程组中所有子进程
- while(waitpid($pid,0)) { // 阻塞等待, 返回子进程pid 则表明child 异常退出,进入下面的再次fork启动
- exit(1) if $fork_retry == 2; //父进程中 判断fork次数 == 2 则退出
- $fork_retry ++;
- if (!($pid = fork)) { // 再次fork.. 子进程中 启动zsh()
- sleep(1);
- print FL "child: fork again!\n"; //写入log 文件
- zsh();
- }elsif ($pid > 0) { // 父进程中... 等待2s 等待子进程执行zsh().. 如果成功则将$fork_retry重置为0
- sleep(2);
- # $fork_retry = 0 if (!waitpid($pid,&WNOHANG));
- my $re = waitpid($pid,&WNOHANG);
- print FL "parent waitpid WNOHANG return value: $re\n"; // 问题也在这 和上面的waitpid 子进程重新fork的时候 有写入log..但是这一句就没写入log...而我再一次kill掉子进程时 才会写入..
- print FL "\n\n";
- }
- }
- }else {
- zsh();
- }
- sub zsh {
- exec("top");
- }
复制代码 其实就是想实现一个 父进程守护子进程..子进程异常退出 则父进程重新fork ..父进程退出时,把子进程也带走...(kill 当前进程组) 关键在于 重新fork 子进程 并且在父进程中判断子进程状态时 总是有问题... 也许逻辑存在问题...求解释~~谢谢~~ |
|