问题标签 [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.

0 投票
0 回答
119 浏览

c - siginfo 字段 si_signo 似乎包含一个随机值

我试图从 siginfo_t 结构中取出东西。对于 SIGABRT (=6) 我得到

正如预期的那样,我的信号处理程序的 signo 参数是 6。但是结构中的 si_signo 似乎有一个随机值。同样,对于 SIGSEGV = 11:

奇怪的是,在 valgrind 中一切似乎都很好,但在 valgrind 之外运行程序时却不行。编译器优化级别无关紧要。

这是 sigaction 的设置方式:

0 投票
1 回答
104 浏览

c - sigaction未初始化gcc 7

让这个 C 文件:

使用 gcc-7 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 编译会引发警告:

但是,使用 gcc-5 (Ubuntu 5.4.0-6ubuntu1~16.04.11),没有警告。

使用 gcc-7,该sa_flags值实际上没有被初始化:

在 gcc-5 中,它得到一个奇怪的值:

我不明白为什么:

  • 使用 gcc-7,sa_flags不会初始化为 0。
  • 使用 gcc-5,sa_flags并且_start函数具有相同的地址。
0 投票
0 回答
286 浏览

c - C中的Sigaction和setitimer

1我试图在 1 秒后杀死一个子进程。子进程是一个外部 c 程序,它运行一些嵌套的 for 循环,如果它通过,则打印“ALL DONE”。循环大约需要 10 秒,所以如果我正确设置了我的计时器和动作处理程序,它永远不会让它“全部完成”。

创建计时器后,子进程使用 execve 运行。

sigaction 和 setitimer 都返回 0,但我不确定我实际上是否正确处理了计时器到期。我试着阅读

但我的结果不成功。

当前输出为:

我不确定为什么它只运行两次然后退出。

0 投票
1 回答
349 浏览

c - si_value 不是使用 POSIX 消息队列的 sigaction 处理程序中的 siginfo_t 的成员

我确定我遗漏了一些明显的东西,但我的问题如下。

作为一个编程练习,我正在尝试创建一个异步 posix 消息队列服务器来在处理程序中异步处理传入的消息。

现在根据我的文档sigaction(2)mq_notify(3)sigevent(7)我的思考过程应该有效。在我发布我的代码之前,我将概述我关于它应该如何工作的思考过程。

  • 使用sigactionandSA_SIGINFO我将为SIGIO.
  • 使用mq_notifyandstruct sigevent我会告诉我的消息队列SIGIO在消息到达时发送到当前进程。
  • 通过将指向我mqd_t的消息队列的指针放入struct sigevent.sigen_value.sigval_ptr我将能够在我的信号处理程序中通过struct siginfo.
  • 正如sigevent(7)告诉我 whenSIGEV_SIGNAL设置在sigev_notifythensi_code中,si_signo并且si_value设置在信号处理程序的siginfo. 具体si_value设置为sigev_value调用时传入的值mq_nofity
  • 在我的信号处理程序中,我应该能够mqd_t通过执行类似(mqd_t *)(info->si_value.sival_ptr)where infosiginfo_t*作为参数传递给我的信号处理程序的操作来获取我的消息队列。我有我mqd_t的结构mq_info_t,因为我稍后会用这个做更多的事情。

现在我的问题似乎源于不同的东西,但我想我会概述我的思维过程,以防它在某种程度上相关。根据sigaction(2)siginfo_t是一个包含各种信息的大型结构,包括si_value.

现在在我的 gdb 中,我收到错误消息,即我siginfo_t的信号处理程序中没有名为si_value. 这个问题在这里提到了同样的想法。

(gdb) p *info $1 = {si_signo = 29, si_errno = 0, si_code = -3, __pad0 = 0, _sifields = {_pad = {128611, 1000, -8896, 32767, 0 }, _kill = {si_pid = 128611 , si_uid = 1000}, _timer = {si_tid = 128611, si_overrun = 1000, si_sigval = { sival_int = -8896, sival_ptr = 0x7ffffffffdd40}}, _rt = {si_pid = 128611, si_uid = 1000, si_sigval = {sival_int = -886 sival_ptr = 0x7fffffffdd40}},_sigchld = {si_pid = 128611,si_uid = 1000,si_status = -8896,si_utime = 0,si_stime = 0},_sigfault = {si_addr = 0x3e80001f663,si_addr_lsb_add = -88896 = 0x0,_upper = 0x0},_pkey = 0}},_sigpoll = {si_band = 4294967424611,si_fd = -8896},_sigsys = {_call_addr = 0x3e80001f663,_syscall = -8896,_arch = 32767}}}

查看siginfo_t为我的构建定义的位置,我发现定义的结构/usr/include/bits/types/siginfo_t.h具有相同的结构。我认为这与我的构建的功能宏有关,但我在该领域知之甚少。我的构建有#define _POSIX_C_SOURCE 199309L.

现在我的代码的关键组件如下

在此先感谢,我希望我已提供所有相关信息。

Arch Linux w 5.3.8 内核

0 投票
1 回答
294 浏览

c - 尽管不在 sa_mask 中,但 POSIX 信号在信号处理程序中被阻塞

我昨天发布了一个类似的问题,但我在概述我的问题方面做得很差,从那时起我认为我已经取得了进展。

我的最小工作示例仍然很长,因此我将发布相关片段,但可以在此处找到完整示例。

我的问题很简单,我有两个 POSIX 消息队列,它们被创建为异步的,并且都由同一个线程上的同一个处理程序处理。我的问题是在一个更基本的层面上,如果一个单独的线程顺序发送到两个队列,那么 sig 处理程序只为第一个队列运行一次。这是有道理的,因为当一个信号调用一个处理程序时,它会自动被阻塞,根据GNU

因此,当我配置我的时,struct sigaction我确保从sigset_t我设置为sa_mask. 我的假设是,然后使用sigaction(2)SA_NODEFER中解释的那样,信号处理程序将能够被递归调用(不确定递归是否在这里是正确的词)。

sa_mask 指定在信号处理程序执行期间应被阻塞的信号掩码(即,添加到调用信号处理程序的线程的信号掩码)。此外,触发处理程序的信号将被阻塞,除非使用 SA_NODEFER 标志。

将信号处理程序附加到消息队列的相关代码

作为健全性检查,我检查了处理程序内的信号掩码以检查 SIGIO 是否被阻止。

但是 SIGIO 似乎没有被阻止。我的推理告诉我,鉴于两个消息队列 MQ1 和 MQ2 在 SIGIO 上异步使用相同的处理程序,应该会发生以下情况。考虑到两个线程的时间和信号的延迟,我很难真正知道。最好说我的一些有根据的猜测是:

  • mq_send到 MQ1 直接mq_send从线程 1 到 MQ2
  • MQ1 的信号处理程序应该在线程 2 上给定来自 MQ1 的 SIGIO 触发
  • MQ2 的信号处理程序会在线程 2 上中断 MQ1 的信号处理程序
  • MQ2 的信号处理程序在线程 2 上完成
  • MQ1 的信号处理程序在线程 2 上完成

运行我之前链接的示例,观察到以下行为

  • mq_send到 MQ1 直接mq_send从线程 1 到 MQ2
  • MQ1 的信号处理程序触发并完成

这让我觉得 SIGIO 在信号处理程序期间以某种方式被阻止或忽略。鉴于我所读到的内容sa_mask和我的健全性检查,pthread_sigmask我不确定为什么我会得到我所看到的行为。我希望我在联机帮助页的某个地方错过了一些小知识。

0 投票
1 回答
86 浏览

linux - 为什么 bash 后台任务会忽略 SIGINT?

我注意到sleep当由以下人产生时不能被 SIGINT 杀死:

我想知道为什么会这样。
以下所有内容都被 SIGINT 杀死:

所以我认为它必须与非交互式bash有关(进入子shell需要括号)并且任务必须在后台运行。

我编写了一个简短的 C 程序来测试该行为,发现 sa_handler 设置为 SIG_IGN - 解释现象,但为什么会这样呢?

我还没有找到任何信息是否是预期的功能(尽管考虑到手册的长度我可能只是错过了它),如果是这样,隐藏它的原因是什么。

我为感兴趣的人提供了 C 代码:

编辑:

pilcrow的答案很棒,我接受了。我想补充一下为什么posix 这么说,根据signal(7) SIGINT 和 SIGQUIT 都来自 keyboard。因此,在与一个分离的进程(而不是由 bash 控制的作业)中忽略它们是有道理的。

EDIT2:

查看Mark Plotnick 评论以获得真实的解释 WHY。

0 投票
0 回答
260 浏览

ios - 自定义信号处理程序不适用于 iOS 上的 Firebase Crashlytics

我正在将 Firebase Crashlytics 崩溃报告框架集成到我的 iOS 应用程序中。该应用程序是用 ObjC 编写的,并且已经具有自定义信号处理程序,因此出现了我观察到的问题 - 如果应用程序自定义处理程序在 Firebase Crashlytics 自定义处理程序之后初始化 - 它们不会触发,但 Crashlytics 处理程序会被触发。另一方面,如果我的应用程序处理程序首先注册,那么一切都按预期工作。

我检查了 Firebase Crashlytics 代码,试图找出任何后来的信号没有被触发但无法捕捉到任何有趣的东西的原因。

这是通过按下 UI 按钮触发信号的代码。事实上,我在 Firebase 仪表板中看到了崩溃报告,但我没有看到 handler_1 创建的文件,也没有看到 NSLog 消息。

0 投票
1 回答
499 浏览

c - 如何将 sigaction 与 4 个子进程一起使用?

我有 1 个父进程和 4 个子进程。我想从每个孩子那里捕获 SIGCHILD 并为每个孩子调用 waitid() 。

问题是我怎么知道 SIGCHILD 来自哪个进程?

还有一个问题,如果我在处理程序中调用 wait(NULL),是否会为发送 SIGCHILD 的孩子调用?这是代码,

0 投票
1 回答
201 浏览

c - linux中的“闹钟”消息

我在linux中的报警代码。

我遇到了“闹钟”消息。但我不想看到这个消息。

我能怎么做?请帮忙。

0 投票
1 回答
62 浏览

multithreading - 从 SIGVTALRM 处理程序调用 siglongjmp(带 sigaction 的多线程)

您好,我在使用 siglongjmp(多线程)和 sigaction 配置 SIGVTALRM 处理程序时遇到问题。

我已经配置了 sigsetjmp 2 个新线程: 1. env[0] 和 func f 上的 PC 2. env[1] 和 func g 上的 PC

我已经为 SIGVTALRM 信号配置了一个处理程序,以在两个线程之间切换。

我将 itimer_virtual 设置为调用一个名为“switchThreads”的函数,该函数在线程之间切换。

我测试了2个案例:

  1. 设置计时器并调用无限循环,它只调用一次信号,然后在 siglongjmp 之后停止调用处理程序。

  2. 设置计时器并在它之后调用 f,甚至不调用处理程序一次。

这是我的代码:

我也有 2 个电话的 strace:

第一个(仅出现一次):

第二个(甚至没有发生一次):

提前致谢!!