gpt4 book ai didi

java - 无法在从 Java 启动的子进程中为 SIGQUIT 设置信号处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:52 24 4
gpt4 key购买 nike

这是对 this one 的后续问题.

举个简单的例子:

public class Main
{
public static void main(String[] args) throws Exception
{
Runtime.getRuntime().exec("./child");

// This is just so that the JVM does not exit
Thread.sleep(1000 * 1000);
}
}

这是子进程:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void handle_sigquit(int sig) {
printf("Signal %d received\n", sig);
exit(1);
}

int main(int argc, char **argv) {
signal(SIGQUIT, &handle_sigquit);
sleep(1000);
}

如您所见,我在子进程中明确设置了一个信号处理程序。

当我从 shell 运行这个进程时,我可以向它发送一个 SIGQUIT;信号被正确接收和处理。但是,如果我从 Java 启动该过程(我在 Linux 上使用 openjdk6),则不会传递信号。这是为什么?

最佳答案

java (OpenJDK 6) 默认阻止子进程中的 SIGQUIT。阻塞的信号在 fork 和 exec 中保持阻塞。您可以通过查看子进程的 procfs 状态文件在 Linux 上看到这一点:

$ grep Sig /proc/11246/status
SigPnd: 0000000000000000
SigBlk: 0000000000000004
SigIgn: 0000000000000000
SigCgt: 0000000000000000

您可以在非线程进程中解锁 SIGQUIT:

sigemptyset(&set);
sigaddset(&set, SIGQUIT);
sigprocmask(SIG_UNBLOCK, &set, NULL);

请注意,您的 printfs 不会出现在终端窗口中; java 将用管道替换子进程的 stdin、stdout 和 stderr,要读取进程的 stdout,您可以执行以下操作

Process p=Runtime.getRuntime().exec("./child");
InputStream stdout = p.getInputStream();

关于java - 无法在从 Java 启动的子进程中为 SIGQUIT 设置信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982014/

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