问题标签 [signal-handling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 分段故障处理
我有一个应用程序,用于捕获任何分段错误或 ctrl-c。使用下面的代码,我能够捕获分段错误,但处理程序被一次又一次地调用。我怎么能阻止他们。为了您的信息,我不想退出我的应用程序。我只需要注意释放所有损坏的缓冲区。
是否可以?
处理程序是这样的。
在这里,对于分段错误信号,处理程序被多次调用,显然 MyfreeBuffers() 给了我释放已释放内存的错误。我只想释放一次,但仍然不想退出应用程序。
请帮忙。
c - 使用 ctrl-c 的信号处理程序 - 需要有关无限循环的帮助
我正在为 ctrl-c 信号使用信号处理程序。即每当生成 ctrl-c 信号而不是退出应用程序时,我都会执行一些操作。
让我们假设如果我的应用程序由于 while(1) 循环(任何错误情况)而挂起,我是否只能在这种情况下退出应用程序?
前任:
谢谢
android - 是否可以从本机代码获取 Android 活动堆栈?
我正在实现一个本机信号处理程序,它生成的日志比标准墓碑文件更详细。我想包含当前任务的活动堆栈的转储,以帮助我诊断错误。
一种方法是使用 JNI 从 Java 代码中获取活动管理器。这会起作用,但不能保证从信号处理程序中调用时是安全的。
我的问题是,是否可以从本机代码中获取有关活动堆栈的信息?
perl - 安全地从信号处理程序访问共享数据结构
我正在尝试确定从为 构建的 perl (v5.14.2) 中的信号处理程序访问公共(读取:在处理程序代码和程序的其余部分之间共享)数据结构是否安全x86_64-linux-thread-multi
,但目标平台是 solaris11)。
perlipc有以下示例代码:
因此,%children
从 while 循环和处理程序访问。这似乎没有问题,因为:
- 不会有两个进程相同
pid
- 访问是由
pid
(但我不确定是否$childer{pid}=1
是原子的和可中断的而不会导致损坏。)
现在,我正在尝试在我的处理程序中做更多的事情:
这里的想法是:每个孩子都属于某个类别(N 到 1)。我想跟踪每个类别有多少孩子。该信息可能来自$categoryForPid
,但我认为这也可能是有问题的(例如,当进行计算的子程序在总结时被中断)。
所以我的问题是:
- 我需要以某种方式在这里同步吗?
附带说明:
- 在 perl 5.12 中是否可以嵌套调用信号处理程序,或者它们是否被解释器线性化?
更新
除了@goldilocks 和他提出的解决方案发现的问题之外,我现在在更新数据结构以确保“原子性”时阻止信号:
c++ - 库的子进程的进程组
我正在开发一个将集成到客户端代码中的库(C++)。该库将产生一些子进程,并且必须监视它们以在它们死后立即重新生成它们(出于任何原因)。我需要使用 vfork 和 exec 来生成这些子进程。
我知道我必须使用信号处理程序来处理 SIGCHLD 并调用 waitpid 来检测哪个孩子已经死了。但是,用户代码可能使用相同的想法来处理自己的子进程。
如果我调用 waitpid,我将检索有关任何可能死亡的子进程的信息(我的或不是我的)。如果死亡过程是我的,没问题……幸福的情况。但是,如果是来自用户,他不会得到任何相关信息,因为我已经调用了 waitpid。
我该如何解决这个问题?
我的第一个想法是使用进程组。第一次分叉时,我会获取子 pid 并将其保存为进程组 ID。我创建的每个孩子,我都会将它的组设置为这个pid。大家觉得这样的选择好不好?(我遇到了麻烦)。
我的第二个想法是将信号处理程序重置为原始处理程序(或直接调用它)。如果我重新发出信号,原始处理程序将能够得到它。之后我必须重新安装我的信号处理程序。会是一个不错的选择吗?
我的第三个选择是使用 INFO(扩展信号处理程序)。我相信消亡过程的pid将在信息结构中可用。如果这是我的一个孩子,我会为此打电话给waitpid,没关系。如果那不是我的,我会调用原始信号处理程序。会是一个不错的选择吗?
最后一个问题。为了能够调用原始信号处理程序,我应该始终恢复它们并重新发出信号还是仅将其作为函数调用来调用就足够了?
非常感谢您的帮助。
java - 如何在 Java 中处理信号/事件
有谁能告诉我如何在 Java 中处理信号?我有一种情况,我需要从应用程序 main() 向线程发出事件/信号。
unix - 通过 sigaction 处理信号
当我遇到此代码和注释时,我正在阅读有关 pselect 系统调用的使用...
现在我不确定sigaction 系统调用...最初我认为它有点保存与信号相对应的处理程序,就是这样...当信号到达时,它会查找它的处理程序并执行处理程序...但是如果那样的话是正确的,那么对应于信号的处理程序将为整个程序保存,并且每当信号到达时都会执行它......所以无论sigaction和select之间的持续时间多么短,都会处理信号......
但是这段代码看起来好像只有当它与 sigaction 的调用/执行一致时才处理信号......在调用完成后,信号将不会由 sigaction 为程序的其余部分设置的处理程序处理(我知道,听起来很荒谬)
请解释!!
java - 是否可以处理源自本机代码的 SEGFAULT?
我有一个 Java 1.6 应用程序,它通过作为接口提供的 JNI 类访问第三方本机模块。最近我们注意到原生模块中发生了 SEGFAULT,导致我们的应用程序崩溃。是否有可能捕获并处理此事件,至少在死前正确记录它?
我在kjp's answer的文章中尝试了这两种 Java 技术。都没有奏效。尝试在“SEGV”上安装信号处理程序会导致异常
VM 已使用的信号:SEGV
我安装的关闭处理程序根本无法触发,大概是因为IBM 文章所述:
关闭挂钩将不会运行,如果
调用 Runtime.halt() 方法来终止 JVM。提供 Runtime.halt() 以允许快速关闭 JVM。
指定了 -Xrs JVM 选项。
JVM异常退出,例如JVM软件产生的异常情况或强制中止。
windows - Autosys:KILLJOB 事件离开孤立进程
我在 Windows 服务器上运行各种进程(批处理文件、java、perl、csharp 脚本/应用程序的混合)。这些进程是使用 Autosys 启动的。Windows 上的 autosys 代理总是在我在作业定义中提供的命令前加上“cmd /c”(参见下面的示例)
这本身不是问题,但是当我尝试通过发送 autosys KILLJOB 事件(根据 Autosys 文档向进程发送中断后跟终止信号)来终止作业时,foobar.exe 不会被终止,它是被杀死的父 cmd.exe。foobar.exe 最终成为一个孤立进程,然后我们需要登录到服务器以使用任务管理器手动终止它。
有没有人有任何解决方案,以便来自 autosys 的终止信号传播到实际过程?
谢谢。
c - 要处理的最重要的信号?
最近我正在开发一个用 c 编写的软件,它有大约 3-4 千行代码。当我开始遇到分段错误时,我添加了一个 SIGSEGV 处理程序。这有助于我在处理程序被制作时指出错误给一个回溯。
我的问题是除了 SIGSEGV 之外,当我们拥有大型软件时,应该处理哪些重要信号,这样错误检测就会很容易。
这可以选择用于防止攻击。Ex 软件在进行关键更新/操作时接收中止信号。标准告诉 SIGHUP、SIGINT、SIGKILL、SIGPIPE、SIGTERM 和其他一些信号具有终止该信号传递到的进程的默认属性。
因此,要为我的软件添加另一层保护,我将不得不改变这些信号的行为。通过保护,我的意思是我不希望我的软件在关键更新之间终止,我将决定何时终止中止。
编辑:我想知道软件设计得如何,如何处理信号,像安全网一样使用它们,这有助于软件的构建。