问题标签 [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.
linux - 信号 SIGSEGV 使用 sigaction 捕获
我正在开发一个在 linux pc 内核版本 4.4.14 上运行的多线程应用程序。我想跟踪一些导致分段错误的灾难性错误。我设置了一个链接到 SIGSEGV 的信号处理程序,以尝试获取导致崩溃的线程的 pid 号。处理函数代码如下:
在 main() 中,我使用以下方法链接 sighandler 函数:
处理程序正在工作,但我无法获取导致故障的线程的 pid。打印:
总是将不同的数字打印为 sender_pid,这些数字都没有意义。为什么我无法获得违规线程的 pid?
我哪里错了?如何在处理函数中获取违规线程的 pid?
非常感谢您的帮助。
问候。
马可·比西奥
linux - SIGINT、SA_RESETHAND 的 sigaction
有没有办法只处理 2 次 SIGINT 并使用 SA_RESETHAND 将其恢复为默认值?我们必须使用 sigaction,并让我们的处理程序自行重新安装 2 次,然后安装标志来重置手。但是有一个问题:如何仅重新安装我的处理程序 2 次以及在这种情况下如何使用 RESETHAND?n-1?
c - waitpid 和信号处理程序,C
我试图在这篇文章中找到我的问题的答案:信号处理程序和 waitpid 共存但对我来说目前还不是很清楚。
我试图解释我的问题:
我正在尝试编写一个涉及父进程及其子进程之间 IPC 的 C 程序。父进程创建 N 个子进程,然后在这样的循环中等待终止:
X 秒后,parent 收到 SIGALRM,然后通过 sigaction 系统调用,它捕捉到警报:
但是,当处理函数返回时,waitpid 也返回 -1,父进程退出上面的 while 循环。目前,处理函数的主体是空的。
我问自己发生了什么——为什么waitpid()
在处理程序调用后返回 -1,即使大多数孩子还活着?为什么函数不会发生这种情况signal()
?
c - 多次使用 sigaction 时出错
每次我的子进程死亡时,我都会尝试调用一个函数。这是通过捕获 execve() 发送的 SIGCHLD 来完成的。我的问题是我的处理函数并不总是被第二次调用。有时是这样,所以我有点困惑。
我的代码是这个:
当我尝试运行它时,有时我的结果是:
这似乎是正确的。但在其他情况下,我的结果是:
这让我相信 sigaction 并不总是收到我的 SIGCHLD 信号。当我运行 valgrind 时,出现以下错误:
但我不确定这意味着什么。
c - SIGACTION 结构
我已经构建了一个函数(基于示例),它允许我忽略信号SIGINT
。该函数计算用户按下的次数CONTROL + C
(中断SIGINT
)。功能如下
我的疑问是关于这行代码
我试图写另一个不同的东西,NULL
但它不起作用。为什么NULL
?NULL
那是什么意思sigaction
?
PS:它可以按我的意愿工作
c - 如何只杀死前台的子进程?
我正在尝试构建一个外壳,并且我已经设法编写了大部分功能,但是我有一个小问题。
说我打字firefox &
。Firefox 将作为后台进程打开。激活一个 BG 标志,&
使父进程不等待子进程。
然后我输入gedit
. Gedit 将作为前台进程打开。这意味着当前父进程正在等待进程关闭。
此时,父进程有两个进程 -firefox
和gedit
. Firefox 没有被等待,目前处于后台,而我们目前正在等待 Gedit 完成。到现在为止还挺好。
但是,如果我决定按 发送一个 SIGINT 信号ctrl-c
,两者firefox
和gedit
都会关闭。不好,只能gedit
关门了。
这是我的信号处理函数:
这是 fork-exec 代码中等待进程或继续运行的部分。
如果我事先暂停一个进程,也会发生这种情况。例如,我运行firefox
然后按ctrl-z
暂停它。然后我运行gedit
并按下ctrl-c
关闭它。之后,如果我按fg
恢复暂停firefox
,它会立即关闭。
我找不到只将 SIGINT 信号发送到前台进程的方法,它总是将信号发送给除父进程之外的所有子进程,无论它们是在后台还是挂起。
以防万一,这是初始化信号处理程序的函数:
c - 为什么 sigaction 处理程序中的上下文是 void 指针?
在sigaction(2)
手册页中:
为什么 ucontext avoid *
当手册页声明它是 a 时ucontext_t *
?
c++ - 如何从 C++ 调用 sigaction
我知道如何在 C 中使用它(使用 signal.h),但是该<csignal>
库是用 C++ 提供的,我想知道它是否包含 sigaction?我尝试运行它,但它说找不到。我想知道我是不是做错了什么?
但由于某种原因,它不起作用。编辑:“不起作用”是指编译器失败并说没有 std::sigaction 函数或结构。
sigaction 是 C POSIX 不是吗?
c - 带有 `SA_SIGINFO` 的 macOS `sigaction()` 处理程序不包括 `si_pid`
我正在尝试编写一个信号处理程序,它需要知道发送信号的进程的 pid。siginfo_t
在带有 Xcode 10 的 macOS 10.14 上,我无法从传递给我的处理程序中获得任何有用的东西。
我已将我的代码简化为以下最小示例来演示该问题。在这个示例中,我生成了一个子进程来发送我想要测试的信号,该信号默认为SIGTERM
,但我尝试过的其他信号都没有更好的效果。
假设您想在 Mac 上构建和测试它,您可能想告诉 lldb 在收到信号时不要停止。您可以使用此 lldb 命令:pro hand -p true -s false SIGTERM
.
我也在用 C++ 编译,但我相信我已经删除了所有这些,示例代码现在应该是纯 C。
请注意,信号是否来自子进程、终端或其他进程并不重要,结果始终si_pid
为 0(以及除si_signo
and之外的所有内容si_addr
)。我发送信号多少次都没关系,所以它似乎不仅仅是一个竞争条件。
如何获取在 macOS 10.14 上发送信号的进程的 pid?我不记得在 10.12 上遇到过这个问题,这是我之前使用的。
这只是演示问题的示例,因此请忽略实际上不会导致问题的任何内容。
如果代码看起来应该像我预期的那样工作,那么我有兴趣查看关于它也可以工作的系统的评论。
c - SIGHUP 信号处理以解除 Unix 系统编程中的命令
我正在读一本关于 Unix 系统编程的书。书中有一个创建守护进程的函数。
部分代码对我来说不是很清楚,特别是以下内容:
在哪里
SIGHUP
如果终端接口检测到断开连接,则发送到与控制终端关联的控制进程(会话领导者)的信号。
所以基本上父进程调用fork
然后退出。这样我们就可以保证孩子不是组长。孩子成为与setsid
.
我不明白何时SIG_UP
生成信号:从定义看来它是在关闭终端窗口时生成的,但从代码中的注释来看
似乎它是在不同的情况下生成的:它是什么时候生成的?
其次它想忽略这个信号,所以它设置sa.sa_handler = SIG_IGN
然后调用sigaction
。如果它忽略SIG_IGN
作为其处理程序的信号设置,为什么将传递给的掩码设置sigaction
为sigemptyset(&sa.sa_mask);
?我的意思是如果没有处理程序,则不会使用在执行处理程序之前设置的掩码:是吗?
完整的功能如下:
编辑
另外我还有一个问题。为什么fork
在函数中被调用两次?