'log' sleep 30 ec-6ren">
gpt4 book ai didi

java - 如果使用了 waitFor,为什么杀死 JVM 也会终止其子进程?

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

如果不使用waitFor,杀死JVM对其子进程没有影响。这是一个例子。

重击脚本:

#!/usr/bin/env bash
echo "Sleeping..." > 'log'
sleep 30
echo "Wake up" >> 'log'

Java代码:

public class Code {
public static void main(String[] args) throws Exception {
Process process = Runtime.getRuntime().exec("./child.sh");
// process.waitFor();
}
}

Java 代码 发出后,JVM 立即终止。和 ps -ef | grep 'child.sh' | grep -v grep 显示:

jing      3535  2761  0 13:47 pts/15   00:00:00 bash ./child.sh

然后在 30 秒后,我检查当前目录中 log 文件的内容。内容是:

Sleeping...
Wake up

上面的 grep 命令现在什么也没有显示。现在我取消注释 process.waitFor() 并重新编译 Code.java。运行 java Code 后,我使用上面的 grep 命令来验证 child.sh 子进程正在运行。然后我发出 Ctrl-C,JVM 终止。现在运行上面的 grep 命令什么也没有显示。 log 文件的内容保持为:

Sleeping...

我已经检查了 Process 的 Javadoc,它没有解释这种行为。然后,我使用以下代码检查 forkexeclpwaitpid 系统调用的行为。它显示了相同的行为。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

static void err_sys(const char* msg) {
printf("%s\n", msg);
exit(1);
}

int main(void) {
pid_t pid;

if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) {
if (execlp("/home/jing/code/lintcode/child.sh", "child.sh", (char *)0) < 0)
err_sys("execlp error");
}

if (waitpid(pid, NULL, 0) < 0)
err_sys("wait error");

exit(0);
}

我在 Ubuntu 14.04 上使用 Oracle JDK 1.8。 uname -a 产生:

Linux jinglin 3.13.0-108-generic #155-Ubuntu SMP Wed Jan 11 16:58:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

谁能解释一下 waitForwaitpid 的效果?

Does Process.waitFor() make the process reliant on the java parent?在MAC平台上问类似的问题。但它缺乏细节。所以我在这里为我的环境问这个问题。

最佳答案

waitPid() 没有什么特别之处,除了您将父进程保留在前台。


如果你 fork 然后等待子进程完成,你有一个像这样的(简化的)进程树:

─┬= 1 init
└─┬= 2 bash --login
└─┬= 3 java code
└─── 4 bash child.sh

java 是终端中的前台进程,子进程在其进程组中。

当您点击 ^C 时,整个前台进程组将终止1


如果您等待,那么一开始您的进程树与上面的相同。 java 进程终止,子进程成为进程树根部进程的子进程。

─┬= 1 init
├──= 2 bash --login
└─── 4 bash child.sh

子进程完成执行并正常终止。


1进程组收到 SIGINT,默认操作是终止。但是,可以安装不同的信号处理程序。

关于java - 如果使用了 waitFor,为什么杀死 JVM 也会终止其子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42153486/

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