- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想在默认为转储核心的致命信号上有一个信号处理程序,它将记录发生的事件,然后核心仍将被转储(除非使用 ulimit 或核心模式禁用)。
我已经测试(在 Linux 4.15 上)如果信号处理程序简单地返回,就会发生这种情况。但是,我没有在文档中找到任何明确说明这一点的明确声明。
那么在 POSIX 或 Linux 文档中是否定义了信号处理程序返回时会发生什么以及发生在何处?
我通过调整工作所需的代码进行了第一次测试,结果比我想象的要复杂得多。当我使用简单的示例程序进行测试时,适用于所有情况的唯一方法是重置处理程序并重新发出信号,如接受的答案中所述。
最佳答案
核心文件在 POSIX.1-2017 XBD ( 3.117 Core File ) 中有一个定义:
A file of unspecified format that may be generated when a process terminates abnormally.
POSIX.1-2017 XSH(2.4.3 Signal Actions,在 SIG_DFL 下)包含以下文本(此处强调的任何部分都表示标准中的相应文本是 XSI -阴影):
If the default action is to terminate the process abnormally, the process is terminated as if by a call to
_exit()
, except that the status made available towait()
,waitid()
, andwaitpid()
indicates abnormal termination by the signal. If the default action is to terminate the process abnormally with additional actions, implementation-defined abnormal termination actions, such as creation of a core file, may also occur.
在 XBD(13. Headers,在 <signal.h> 下)我们看到 SIGABRT
、SIGBUS
、SIGFPE
, SIGILL
, SIGQUIT
, SIGSEGV
, SIGSYS
, SIGTRAP
、SIGXCPU
和 SIGXFSZ
标记为
A -- Abnormal termination of the process with additional actions.
因此,从 POSIX 的角度来看,无论信号处置如何,您都不能依赖正在生成的核心文件。
但是,在 Linux 手册 (signal(7)
) 中,每个在 POSIX 中具有默认操作“A”的信号都以默认配置“Core”列出。这可能是以下关于 SIGSYS
、SIGXCPU
和 SIGXFSZ
的手册摘录所指的内容:
Linux 2.4 conforms to the POSIX.1-2001 requirements for these signals, terminating the process with a core dump.
正如上面的 POSIX 摘录告诉我们的那样,这不是 POSIX.1-2017 中的硬性要求。
现在仍然没有回答注册一个信号捕获函数是否使异常终止的信号 Action 无效的问题。我相信,如果这样做,它会导致至少一些信号出现未定义的行为,根据 XSH 的以下段落(2.4.3 信号操作,在 Pointer to a Function 下):
The behavior of a process is undefined after it returns normally from a signal-catching function for a
SIGBUS
,SIGFPE
,SIGILL
, orSIGSEGV
signal that was not generated bykill()
,sigqueue()
, orraise()
.
因此,为了在所有情况下避免 UB,我相信您必须将信号处置重置为 SIG_DFL
,然后从信号处理程序中重新raise()
信号反正。此外,任何捕获这些信号的处理程序都应该在备用信号堆栈上运行,但我不太确定这样做是否通常是安全的,以及它是否是第一位的。
关于linux - 从默认致命信号的信号处理程序返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58116539/
我的电脑正确配置了 SSH,我在尝试克隆存储库时遇到了这个错误: 我运行这个命令来克隆存储库 git clone ssh://git-codecommit.us-west-2.amazonaws.co
我试图下载android源代码。但是遇到了一个问题。 # repo init -u https://android.googlesource.com/platform/manifest fatal:
尝试运行我 4 年前开发的 Rails 4 项目,从那时起我一直在维护,我遇到了下一个错误,该错误在启动时卡住了应用程序: machine stack overflow in critical reg
这个问题在这里已经有了答案: psql: FATAL: role "postgres" does not exist (32 个答案) 关闭上个月。 我正在设置 Postgresql 以与 Rail
我正在创建新分支并尝试推送该分支(我尝试了以下命令): git push --all -u git push origin NewBranch 但在这两种情况下我都会收到此错误: Permission
我尝试克隆这个 repo 几次,但得到了同样的错误。是不是因为它太大而我的连接速度很慢? $ git clone https://git01.codeplex.com/typescript Cloni
我正在尝试使用 http://danielmiessler.com/study/git/#website 设置 git管理我的网站。 我已经到了指令的最后一步:git push website +ma
当我使用快速启动方法安装Eucalyptus云时,我看到安装失败。以后检查日志文件时,遇到以下错误。 最佳答案 错误消息是: Invalid gateway due to subnet/netmask
黄色, 我尝试按照以下步骤设置选项“在没有用户名和密码的情况下访问(推送到)Github”。 https://medium.com/@amanze.ogbonna/accessing-pushing-
我很难用 postgres 设置 django。 这是我的设置.py: DATABASES = { 'default': { 'ENGINE': 'django.db.back
当我尝试从实时实例服务器访问数据库时出现此错误。有谁知道原因吗? 最佳答案 可能是你的硬盘没有可用空间 关于PostgreSQL:致命:XX000:无法写入初始化文件,我们在Stack Overflo
我正在尝试连接到我的 PostgreSQL 服务器,但 psql 提示我没有有效的客户端证书。以下是我创建证书的方式: 自签名服务器证书: openssl req -new -text -nodes
我团队中的其他人创建了一个新的 git 分支,提交并推送到我们使用的常用远程。当我尝试检查这个分支时,我得到了这个: % git checkout 12382 fatal: Cannot switch
我正在尝试让 TravisCI 自动部署我的 Hakyll 静态站点,根据 this guide . 这是我的存储库的设置方式。我有我的源代码分支,其中包含我的 hakyll 和 Markdown 文
尝试提交时 git commit -a -m "Huge update" 我明白了 fatal: could not parse HEAD Error When Committing 看完fatal:
我想在我的 flutter 应用程序上使用 fcm,所以在创建 firebase 控制台并在我的 gradle 中安装了一些依赖项之后,如下所示: build.gradle:项目 dependenci
我是 GIT 的初学者,现在遇到了一个大问题。我在另一台 PC 上提交并推送了一些文件,现在在我的家用 PC 上,git 坏了。 请看下面: $ git status fatal: failed to
我想从 github 上克隆一个项目到我的电脑上 D:\Projects> git clone https://github.com/***/***.git 但是在下载的时候,出现了几个致命的错误:
所以我尝试使用以下命令获取opencv_contrib: $ git clone https://github.com/Itseez/opencv_contrib 这给了我以下错误: fatal: d
这是我在pod文件中使用的行 pod'SDWebImage','〜> 3.8' 以前是 pod'SDWebImage','〜> 3.7' 我尝试了以下 pod安装 pod更新和 pod更新'SDWeb
我是一名优秀的程序员,十分优秀!