问题标签 [sigaction]
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 - 如何使用 sigaction()?结构 sigaction 未定义
我正在做简单的 sigaction 示例来练习 C,但是当我尝试编译我的代码时,它声称struct sigaction不存在 [1]。
当我检查我生成的一些旧代码时,我看到我在文件的最顶部添加了一些 POSIX 字符串 [2]。但是,当我阅读 sigaction 手册(man 2 sigaction)时,其中没有任何关于 _POSIX_SOURCE 的内容,最接近的是 _POSIX_C_SOURCE 不起作用。我如何以及何时知道要使用哪个 POSIX?当我尝试其他人建议的简单代码时,没有 _POSIX_SOURCE 它不起作用。
[1]
[2]
当我编译第一个示例时,结果是这些错误消息。
c - 如何修复信号处理程序分配
对于 Linux C 编程,我有这个处理程序和主要方法:
如果我只用 1 个参数制作处理程序,void handler(int num)
它就可以正常工作;但是,我将无法使用si->si_pid
. 我得到的警告是:
我做sig.sa_action
吗?我想修复警告
fork - 使用 sigaction 停止子循环并拦截 Ctrl*C 时出现问题
我正在尝试编写一个使用 sigaction 拦截 Ctrl^C 的程序,然后终止 fork 的子代。
代码:
我试图为我的示例删除所有不必要的代码。出于某种原因,当我按下 Ctrl^C 时,我无法让中断工作。最终,我希望能够关闭孩子并继续在父母中。我在这里做错了吗?
c - 函数中的 Sigaction 声明
Unix 中的 sigaction 是否只在main
函数中声明一次,或者我应该在我main
调用的每个函数中声明它,所以如果在执行不在 my 内部时main
出现信号,信号处理程序将调用?那么,我必须sigaction
在开始时只声明一次main()
还是必须在每个函数中声明它?
linux - 在同一项目中使用 .sa_sigaction 和 .sa_handler(手册页说明)
在查找 sigaction 的手册页时,我偶然发现了 Linux 手册页中的一个令人困惑的注释:
在某些体系结构中涉及联合:不要同时分配给 sa_handler 和 sa_sigaction(sigaction 手册页)。
有两种可能的阅读方式:
- 据我了解,这是否意味着您不允许设置
.sa_sigaction
和.sa_handler
在同一个struct sigaction
. - 还是只允许在整个项目中使用
.sa_sigaction
OR ?.sa_handler
根据解释 1. 上面这段代码是可以的,但是当定义 2. 正确时,它会因为我混合而无效。
哪一个是真的?注意:在我的架构上,它被定义为一个联合
c - 使用 sigaction、SIGKILL 和警报处理程序杀死耗时超过 3 秒的分叉进程
我正在编写一个 C 程序,它将第一个程序的输出通过管道传输到第二个程序的输入。如果任一程序的终止时间超过 3 秒,则程序需要使用 sigaction 和 SIGKILL 终止。
我的程序适用于“好”的输入。我不确定如何实现它,以便它在超过 3 秒的进程中表现得应有尽有。这是我第一次使用进程间通信,我被迫使用 sigaction 来促进它。我完全迷失了这部分程序的实施。
我创建了两个子进程:每个程序一个。如果我的一个子进程的终止时间超过 3 秒,我如何使用系统调用、sigaction 和 SIGKILL 来终止整个程序?
c - 为什么 sigaction 调用核心转储
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
如果act 为非NULL,则从act 安装信号signum 的新动作。如果 oldact 不为 NULL,则前一个操作保存在 oldact 中。
这来自https://linux.die.net/man/2/sigaction,我不太明白“先前的操作”是什么意思。这是否意味着默认情况下引用的操作signum
?我已经测试了如下代码,但它给了我一个核心转储:
c - 在信号处理程序中遍历 TAILQ
我有一个维护结构列表的应用程序,由 TAILQ 链接在一起。每个结构都有一个脏位,以及指向内存中一些专用特殊页面的指针。我需要知道是否有人写入这些页面中的任何一个,因此我mprotect
将它们写入PROT_READ
,然后安装一个信号处理程序以在检测到 SEGV 时关闭。
当处理程序被调用时,我检索地址并遍历我的列表以查看 segv 是否发生在我的任何页面上,如果发生了,我将页面标记为脏,并且mprotect
它是可写的。所以它看起来像这样:
我担心能否在信号处理程序中安全地遍历列表。如果一个线程在另一个线程生成 SEGV 时修改列表,我担心会有一些未定义的行为。
如果我可以在修改列表时查看线程的地狱,并且我知道它不会生成 SEGV,是否有任何安全的方法可以在信号处理程序中遍历此列表?也就是说,如果我在 SEGV 关闭时检测到列表正在被修改,有没有办法阻止信号处理程序,直到另一个线程完成更新列表?
最后一个问题——在某些情况下,可能需要修改信号处理程序中的列表(添加或删除条目)。有没有安全的方法来做到这一点?
android - 如何优雅地处理 sigaction() 并回馈父进程
有没有办法通过 sigaction 捕获信号并在正确处理错误后返回父进程?更具体地说,通过以下代码,我可以做一些错误处理,但其他人在我的 sigaction 处理程序之后无法获得相同的崩溃通知。..非常感谢!
c - 我应该在信号处理程序中放入什么以使其终止除父进程之外的所有进程?
我正在用 C 制作一个基本的 shell,我想抓住 Ctrl+C 这样它就不会杀死我的程序,而是会杀死在我的程序下运行的所有进程。我不知道在我的信号处理程序中设置什么代码来获得这种效果。
此外,一旦我有代码来捕获 SIGINT 并让它不杀死我的进程,我是将它全局放在我的程序中,还是将它放在它自己的函数中,我在某个时候在 main 中运行,或者我会放例如,它在哪里创建和执行流程int execCmd(char **cmds){...}
?
非常感谢您的任何帮助和建议。