- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是对 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/
所以我是一个编程新手,我想写一个带有时间倒计时的2048游戏。当时间到了,定时器应该使用pthread_kill()来结束runTheGame(),这是玩游戏的函数。 我搜索了互联网,他们告诉我使用
下面的程序非常简单:它每半秒输出一个点。如果它收到一个SIGQUIT,它会输出十个Q。如果它收到一个 SIGTSTP (Ctrl-Z),它会输出十个 Z 如果它在打印 Q 时收到一个 SIGTSTP,
我想从我的代码中启动计算器应用程序,用sigint-2中断它显示它已被中断,再次启动它,然后用sigquit-9退出它,想法是在C代码中中断它所以不需要按 Ctrl+C 或 Ctrl+ Write a
我想通过终端向我的程序发送 SIGQUIT。 首先什么是SIGQUIT信号? ctrl+c 还是其他?其次,我如何捕获该信号来打印一些消息(我说的是Linux) 最佳答案 SIGQUIT 通常用于终止
我正在尝试编写一个函数来在进程上安装信号处理程序,以便在第一次调用该信号时忽略 SIGQUIT 信号,然后在第二个 SIGQUIT 信号时退出。我打算使用计数器的全局变量来计算 SIGQUIT 信号发
我试图忽略子线程的第一个 SIGQUIT...具体来说,在每次调用后写入控制台并在第二次调用时退出。 我试过这段代码的变体;即每个类似的堆栈溢出线程分成两个函数。不幸的是,对于 child 的处理程序
我有一个主进程,它通过 UNIX 套接字与子进程进行通信。当主进程收到 SIGQUIT 时,我无法写入子套接字。我希望子进程知道主进程正在退出并优雅地退出。 SIGQUIT 陷阱之外的通信按预期完美工
我正在实现键盘扩展。但有时它在启动时会遇到 SIGQUIT 信号。 情况如下: 点击textView,出现键盘 点击任意位置并隐藏键盘 更改为另一个应用 点击textView并等待键盘出现 崩溃!!!
我正在尝试将一些 C 软件移植到 win32,但我不知道如何处理 SIGQUIT 信号。我检查了 Mingw 的 signal.h,它不支持 SIGQUIT(或 SIGHUP 就此而言,但我假设我可以
我在处理 stdin 和 sigquit 信号时遇到了问题。任务是忽略 sigquit 信号。一切都很好,除了所有“读取”缓冲区都消失了,我不知道如何避免它。这是我的代码: #include #in
我正在使用 cygwin 来测试 Linux 系统编程。我的问题是在使用信号时。我想创建 n 个进程,当父进程收到子进程发送的信号 SIGALRM 时,父进程将杀死这些进程。每个 child 都会发送
我可以编写捕获 SIGINT 的 shell 脚本,但我似乎无法捕获 SIGQUIT。 #!/bin/bash function die { echo "Dying on signal $1"
我正在编写一个有两个 for 循环的程序,在第一个 for 循环期间(仅打印 1-5 并在其间休眠 1 秒)SIGINT 和 SIGQUIT 将被阻止,在第二个 for 循环中仅 SIGINT 将被阻
我正在编写一个需要用以下 bash 行终止的多线程程序: killall -QUIT -w procname 我决定使用一个线程来接收一些我需要处理的信号,比如 SIGQUIT 和 SIGUSR1,而
击键 Ctrl + \ 导致 python 和 ipython 核心转储并立即退出。我怎样才能防止这种情况发生?我不想禁用按键或重新映射键盘。 我最近换用了英式键盘,反斜杠/竖线键(我习惯在 Ente
有时 Ctr-C (SIGINT) 和 Ctrl-\ (SIGQUIT) 都太弱了。有没有一种方法可以使用快速键盘快捷键对当前连接的进程进行更积极的终止(例如 kill -9)? 最佳答案 如果您是
我正在尝试解决一个问题,因为我正在学习在 C 中使用系统调用。我使用的是 Ubuntu 12.04 64 位。 问题的陈述说我需要实现一个代码,允许在其他命令 (cmd1) 正确结束后执行命令 (cm
知道如何在没有 JDK 的情况下生成 java heapdump 吗?我能够获取 processid,但我无法直接访问机器,并且没有安装 JDK。 You can alternatively use
我有这个: ping -q xxx.xxx.xxx.xxx & disown; pingpid=$! for run in {1..3}; do sleep 5 stats+=$(kill -
这个问题在这里已经有了答案: How to capture Control+D signal? (9 个回答) 关闭 6 年前。 脚本: echo $$ trap "echo \"hai\"" 3
我是一名优秀的程序员,十分优秀!