问题标签 [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.
linux - 进程如何杀死自己?
终端:
前 5 秒显示“watch ls”的输出,然后它终止,因为我发送了一个 SIGTERM。
问题:进程如何杀死自己?我已经完成了 kill(getpid(),SIGTERM);
我的假设: 所以在 kill() 调用过程中,进程切换到内核模式。kill 调用将 SIGTERM 发送到进程并将其复制到进程的进程表中。当进程返回到用户模式时,它会在其表中看到信号并自行终止(如何?我真的不知道) (我认为我的假设某处出错了(可能是一个错误)......所以请开导我)
这段代码实际上是一个存根,我用它来测试我的项目的其他模块。它为我完成了这项工作,我对此感到满意,但我心中存在一个问题,一个过程实际上是如何杀死自己的。我想知道一步一步的假设。
提前致谢
阿尼鲁德·托默
c - 分叉后调用信号
“代码清单 1”和“代码清单 2”之间有什么区别吗?因为在代码清单 1 中,子进程能够捕捉到 SIGTERM 信号并很好地退出。但是代码列表 2 在 SIGTERM 信号上突然终止。
我正在使用 Linux 和 C。
代码清单 1
代码清单 2
奇怪的是,在代码清单 2 中,子进程和父进程都为 SIGTERM 设置了信号处理程序。所以,这应该有效。不是吗?
c++ - longjmp 和 RAII
所以我有一个库(不是我写的),不幸的是它abort()
用来处理某些错误。在应用程序级别,这些错误是可以恢复的,所以我想处理它们而不是让用户看到崩溃。所以我最终写了这样的代码:
不是很优雅的代码。由于这种模式最终不得不在代码的几个地方重复,我想稍微简化一下,并可能将它包装在一个可重用的对象中。我的第一次尝试涉及使用 RAII 来处理信号处理程序的设置/拆卸(需要完成,因为每个函数需要不同的错误处理)。所以我想出了这个:
当然,这种function
方式更简单,更清晰,但今天早上我想到了一个想法。这能保证工作吗?这是我的想法:
setjmp
在对/的调用之间没有变量是易失的或变化的longjmp
。- 我通常在与 and
longjmp
相同的堆栈帧中找到一个位置,因此我允许代码执行编译器在函数退出点发出的清理代码。setjmp
return
- 它似乎按预期工作。
但我仍然觉得这可能是未定义的行为。你们有什么感想?
perl - Perl:在执行的分叉子中安装信号处理程序
我在为 fork() 的守护进程管理信号处理中找到了答案,这对我正在做的事情非常有帮助。我不确定如何解决
“因此,您需要在启动时在执行的进程中安装任何信号处理”
我无法控制启动的过程。我有什么办法可以exec
从 fork 的父级强制 ed 上的一些信号句柄?
编辑: {
我正在编写一个监视长时间运行进程的 Perl 模块。代替
你会用
我为该文件创建了一个锁定文件,并且如果当前正在运行具有匹配 ID 的呼叫,<ID>
则不要让另一个呼叫通过。my_system(<ID>...)
父 fork/execs<long-running cmd>
并在终止时清理锁定文件。我想让孩子自给自足,这样父母就可以退出(或者如果父母得到 a ,孩子可以自己照顾自己kill -9
)。
}
c - 如何解决 Linux 32 位机器上的 REG_EIP undeclared (First use in this function ) 错误?
我在用 gcc 用 C 语言编写的信号处理程序编译时遇到错误,在发生分段错误后显示转储的寄存器值。当我尝试使用代码访问它时:
我通过添加尝试了代码
也
但是,出现的错误是:
并且所有寄存器都出现错误
我尝试了许多文件......但无法获得解决方案。任何人都可以分享解决此错误的详细信息。
提前感谢所有回复者
linux - 如何在 Linux 内核中用用户定义的处理程序替换默认处理程序来处理生成核心转储的异常?
我正在研究“在 Linux 平台上创建事后数据记录器”。我之前也发布了一个关于这个项目的问题。在那里,我得到了 RHEL 版本中创建核心转储文件的调用流程机制:2.6.18.128-el5。
如下:
现在,根据项目要求,我需要使用我自己的用户定义的信号处理程序来修改默认信号处理程序定义,该处理程序处理各种导致核心转储的异常(、、等SIGSEGV
)SIGFPE
。SIGABRT
此外,我需要构建内核以使用我的处理程序替换默认处理程序来保持内核中的更改。
任何人都可以分享进行这些操作的程序吗?
提前感谢所有回复者:)
感谢 vlc
c++ - 有什么方法可以防止用户注册/使用他自己的信号处理程序并始终使用特定的处理程序?
我的要求是:我的工具中有一个信号处理程序,它在某个特定间隔之间注册和使用(我正在使用计时器)。
现在,此信号处理程序不应允许在此处理程序注册后注册任何其他处理程序。(但是这个限制只持续很短的时间,这意味着在该持续时间之后用户可以自由地调用他自己的处理程序)
有没有办法做到这一点?
注意:我的工具实际上是用 C++ 编写的,但是概念非常接近,并且由于更多人熟悉它,所以我也将 C 标记为 C++ 请随时要求更多说明(如果需要)
python - 使用 Python 安装信号处理程序
(这里有对这个问题的跟进)
我正在尝试为 Linux 编写基于 Python 的 Init 系统,但在获取 Python 初始化脚本的信号时遇到问题。从'man 2 kill'页面:
在基于 Python 的 Init 中,我有一个测试函数和一个信号处理程序设置来调用该函数:
如果我从另一个 TTY(初始化脚本在另一个 tty 上执行 sh)发送信号,它会被完全忽略,并且永远不会打印文本。kill -HUP 1
我发现这个问题是因为我为我的 Python init 编写了一个 reaping 函数,以便在其子进程死亡时获取它们,但它们都只是僵死了,花了一段时间才发现 Python 从未收到 SIGCHLD 信号。只是为了确保我的环境是健全的,我编写了一个 C 程序来分叉并让孩子发送 PID 1 一个信号并且它确实注册了。
如何安装系统将在signal.signal(SIG, FUNC)
不工作时确认的信号处理程序?
我将尝试使用 ctypes 用 C 代码注册我的处理程序,看看是否可行,但如果可能的话,我宁愿使用纯 Python 答案。
想法?
(我不是程序员,我真的在这里:p)
下面的测试代码...
matlab - Matlab:是否可以创建信号处理程序(.m 脚本)
我已经查看了文档等,但我没有看到任何明显的东西。我想要一个信号处理程序,可以拦截^C
,^\
或其他可用于中断长时间运行的脚本(每个离散计算通常小于 1 秒)并允许它优雅退出并保存当前状态的按键。
Matlab 确实有 COM 的事件处理程序,但它是仅限 Windows 的,而且我在 *nix 环境中。
如果答案是“运气不好”,我对此很满意……我只是还没有看到任何说我是 SOL 的东西。
c - 信号处理函数不断循环
我为处理 SIGINT 信号而创建的函数陷入了一个恒定循环。这个想法是让 CTRL-C 被父进程忽略但发送到子进程(他们默认处理它)。发生的情况是当我按下 CTRL-C 时,会调用信号处理函数,但会陷入无限循环。kill 调用应该向进程组中的所有进程发送 SIGTERM,但发送方进程除外。任何帮助,将不胜感激。
功能代码为:
}
函数调用代码(在 main 中)是: