问题标签 [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 投票
1 回答
798 浏览

linux - 信号 SIGSEGV 使用 sigaction 捕获

我正在开发一个在 linux pc 内核版本 4.4.14 上运行的多线程应用程序。我想跟踪一些导致分段错误的灾难性错误。我设置了一个链接到 SIGSEGV 的信号处理程序,以尝试获取导致崩溃的线程的 pid 号。处理函数代码如下:

在 main() 中,我使用以下方法链接 sighandler 函数:

处理程序正在工作,但我无法获取导致故障的线程的 pid。打印:

总是将不同的数字打印为 sender_pid,这些数字都没有意义。为什么我无法获得违规线程的 pid?

我哪里错了?如何在处理函数中获取违规线程的 pid?

非常感谢您的帮助。

问候。

马可·比西奥

0 投票
0 回答
679 浏览

linux - SIGINT、SA_RESETHAND 的 sigaction

有没有办法只处理 2 次 SIGINT 并使用 SA_RESETHAND 将其恢复为默认值?我们必须使用 sigaction,并让我们的处理程序自行重新安装 2 次,然后安装标志来重置手。但是有一个问题:如何仅重新安装我的处理程序 2 次以及在这种情况下如何使用 RESETHAND?n-1?

0 投票
1 回答
765 浏览

c - waitpid 和信号处理程序,C

我试图在这篇文章中找到我的问题的答案:信号处理程序和 waitpid 共存但对我来说目前还不是很清楚。

我试图解释我的问题:

我正在尝试编写一个涉及父进程及其子进程之间 IPC 的 C 程序。父进程创建 N 个子进程,然后在这样的循环中等待终止:

X 秒后,parent 收到 SIGALRM,然后通过 sigaction 系统调用,它捕捉到警报:

但是,当处理函数返回时,waitpid 也返回 -1,父进程退出上面的 while 循环。目前,处理函数的主体是空的。

我问自己发生了什么——为什么waitpid()在处理程序调用后返回 -1,即使大多数孩子还活着?为什么函数不会发生这种情况signal()

0 投票
1 回答
902 浏览

c - 多次使用 sigaction 时出错

每次我的子进程死亡时,我都会尝试调用一个函数。这是通过捕获 execve() 发送的 SIGCHLD 来完成的。我的问题是我的处理函数并不总是被第二次调用。有时是这样,所以我有点困惑。

我的代码是这个:

当我尝试运行它时,有时我的结果是:

这似乎是正确的。但在其他情况下,我的结果是:

这让我相信 sigaction 并不总是收到我的 SIGCHLD 信号。当我运行 valgrind 时,出现以下错误:

但我不确定这意味着什么。

0 投票
1 回答
2311 浏览

c - SIGACTION 结构

我已经构建了一个函数(基于示例),它允许我忽略信号SIGINT。该函数计算用户按下的次数CONTROL + C(中断SIGINT)。功能如下

我的疑问是关于这行代码

我试图写另一个不同的东西,NULL但它不起作用。为什么NULLNULL那是什么意思sigaction

PS:它可以按我的意愿工作

0 投票
2 回答
3746 浏览

c - 如何只杀死前台的子进程?

我正在尝试构建一个外壳,并且我已经设法编写了大部分功能,但是我有一个小问题。

说我打字firefox &。Firefox 将作为后台进程打开。激活一个 BG 标志,&使父进程不等待子进程。

然后我输入gedit. Gedit 将作为前台进程打开。这意味着当前父进程正在等待进程关闭。

此时,父进程有两个进程 -firefoxgedit. Firefox 没有被等待,目前处于后台,而我们目前正在等待 Gedit 完成。到现在为止还挺好。

但是,如果我决定按 发送一个 SIGINT 信号ctrl-c,两者firefoxgedit都会关闭。不好,只能gedit关门了。

这是我的信号处理函数:

这是 fork-exec 代码中等待进程或继续运行的部分。

如果我事先暂停一个进程,也会发生这种情况。例如,我运行firefox然后按ctrl-z暂停它。然后我运行gedit并按下ctrl-c关闭它。之后,如果我按fg恢复暂停firefox,它会立即关闭。

我找不到只将 SIGINT 信号发送到前台进程的方法,它总是将信号发送给除父进程之外的所有子进程,无论它们是在后台还是挂起。

以防万一,这是初始化信号处理程序的函数:

0 投票
1 回答
594 浏览

c - 为什么 sigaction 处理程序中的上下文是 void 指针?

sigaction(2)手册页中:

为什么 ucontext avoid *当手册页声明它是 a 时ucontext_t *

0 投票
1 回答
5581 浏览

c++ - 如何从 C++ 调用 sigaction

我知道如何在 C 中使用它(使用 signal.h),但是该<csignal>库是用 C++ 提供的,我想知道它是否包含 sigaction?我尝试运行它,但它说找不到。我想知道我是不是做错了什么?

但由于某种原因,它不起作用。编辑:“不起作用”是指编译器失败并说没有 std::sigaction 函数或结构。

sigaction 是 C POSIX 不是吗?

0 投票
2 回答
980 浏览

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_signoand之外的所有内容si_addr)。我发送信号多少次都没关系,所以它似乎不仅仅是一个竞争条件。

如何获取在 macOS 10.14 上发送信号的进程的 pid?我不记得在 10.12 上遇到过这个问题,这是我之前使用的。

这只是演示问题的示例,因此请忽略实际上不会导致问题的任何内容。

如果代码看起来应该像我预期的那样工作,那么我有兴趣查看关于它也可以工作的系统的评论。

0 投票
1 回答
419 浏览

c - SIGHUP 信号处理以解除 Unix 系统编程中的命令

我正在读一本关于 Unix 系统编程的书。书中有一个创建守护进程的函数。

部分代码对我来说不是很清楚,特别是以下内容:

在哪里

SIGHUP如果终端接口检测到断开连接,则发送到与控制终端关联的控制进程(会话领导者)的信号。

所以基本上父进程调用fork然后退出。这样我们就可以保证孩子不是组长。孩子成为与setsid.

我不明白何时SIG_UP生成信号:从定义看来它是在关闭终端窗口时生成的,但从代码中的注释来看

似乎它是在不同的情况下生成的:它是什么时候生成的?

其次它想忽略这个信号,所以它设置sa.sa_handler = SIG_IGN然后调用sigaction。如果它忽略SIG_IGN作为其处理程序的信号设置,为什么将传递给的掩码设置sigactionsigemptyset(&sa.sa_mask);?我的意思是如果没有处理程序,则不会使用在执行处理程序之前设置的掩码:是吗?

完整的功能如下:

编辑

另外我还有一个问题。为什么fork在函数中被调用两次?