问题标签 [signal-handling]

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 投票
3 回答
4634 浏览

multithreading - 信号处理程序的执行在 linux 中是不可抢占的吗?

我有一个p使用信号处理程序注册的进程SIGALRM。设置了一个定时器来定期向SIGALRM进程发送信号p。进程中还有多个线程正在运行p。信号处理程序在被触发和执行时是否不可抢占?或者说,是不是信号处理程序的执行不会被进程中的任何线程中断p

PS:我认为信号处理程序是在内核中执行的(是吗?)并且内核对用户模式线程是不可抢占的?如果说错了请指正...

0 投票
1 回答
4763 浏览

unix - Unix/Linux:SIGCONT/SIGTSTP 的处理程序

我目前正在使用信号编写程序,但遇到了这个麻烦:

如何在不发送SIGSTOP/的情况下将执行程序的状态更改为停止/运行SIGCONT

我明白,我需要使用:

但是如何获取当前运行进程的结构task_struct呢?

另外:如果这就是我需要做的一切(调用这两个函数)。

提前致谢!

0 投票
2 回答
1820 浏览

c - 为什么我在 C 中的管道不起作用?

作为一个练习,我需要使用信号处理程序,并在获得信号时使用管道在两个进程之间发送一些消息。下面是我的源代码。当我运行它时,我可以让管道工作,两个进程都可以交谈,只要我在它们的主方法中调用管道(在本例中为 process1() 和 process2() )。但我想使用信号处理程序中的管道。但是现在管道不工作了。这是我得到的一些输出:

'898' 和 '130' 应该相等,但不是。我知道管道工作正常,所以我认为这与信号有关......但是什么......?

源代码:

0 投票
1 回答
1968 浏览

c++ - C++ 中的信号处理

类型void (*)(int)参数与类型参数不兼容__sighnd64_t

下面是我的简单代码:

我正在研究openvms。我可以通过某种类型转换来避免编译错误吗?我的编译器需要 `__sighnd64_t __64_signal(int, __sighnd64_t);

在处理程序 extern c 周围添加有效。谢谢

0 投票
3 回答
3336 浏览

c++ - C++ 异常和信号处理程序

我正在阅读Bjarne Stroustrup的 The Design and Evolution of C++。关于异常处理和异步信号,如下所述:

异常可以用来处理信号之类的事情吗?几乎可以肯定,在大多数 C 环境中都不会。问题是 C 使用了像 malloc 这样不可重入的函数。如果在 malloc 中间发生中断并导致异常,则无法阻止异常处理程序再次执行 malloc。

一个 C++ 实现,其中调用序列和整个运行时库是围绕重入的要求设计的,这将使信号有可能抛出异常

作者所说的“没有办法阻止异常处理程序再次执行malloc”是什么意思?使函数可重入如何使从信号处理程序中抛出异常成为可能?

0 投票
2 回答
1876 浏览

linux - 在调用堆栈上使用 malloc/free 的 Signal Handler 在 Linux 64 位上回溯

下面是我想在运行“Red Hat Enterprise Linux 5.5 (Tikanga) Kernel 2.6.18-194.el5xen x86_64”操作系统的机器上使用的源代码示例。

一般的想法是我想要回溯某个线程,所以我为那个线程发出一个 SIGUSR1 信号,并且一个处理程序执行一个 backtrace() 调用。

在我下面的场景中,FrameTwo 函数循环调用 malloc 和 free。每当为这个特定线程引发信号并且 free 或 malloc 在调用堆栈上时,当信号处理程序调用 backtrace() 时,程序就会崩溃。

我从其他来源了解到不应从信号处理程序调用回溯,因此我为此编写了自己的函数 grok_and_print_thread_stack()。

它使用 RBP 寄存器来导航堆栈(RBP 包含当前帧的基指针指向前一帧的基指针),但是这种算法在这种情况下也不起作用:当 _int_free() 在调用堆栈上时,RBP寄存器导航算法中断,因为 _int_free 的 RBP 是某个值,例如 0x20,它不是有效帧的基指针。

有谁知道如何从寄存器中导航调用堆栈?或者我怎样才能将回溯用于我的目的?

0 投票
3 回答
586 浏览

c - 在克隆线程上发送和处理信号

更新:这似乎是一个时间问题。在调用 kill 之前添加调用 sleep 可以使一切按预期工作。

我一直在玩 clone(2) 并试图了解它是如何工作的。我目前无法向克隆进程发送信号。我有以下代码:

产生以下输出:

孩子明明被信号杀死了,为什么没有调用信号处理程序?

0 投票
5 回答
69017 浏览

linux - ctrl-x 在终端中使用时会发送哪个信号?

在 Linux/Unix 上有信号。CtrlC一个 ( SIGINT) 对我来说是显而易见的。现在,在其他一些应用程序中,有信号通过CtrlX?!这甚至是一个信号还是会产生一个转义序列?还有什么我可以用作类似于CtrlCCtrlVCtrlX...)的东西吗?

如果有人有线索,我对 C 的熟悉比对 bash 的多,但是两种语言的答案都值得赞赏!

0 投票
2 回答
3034 浏览

c - Ncurses:检测是否按下 F1 键并使用信号

我正在尝试学习 ncurses 库,我想出了以下代码:

此代码中的问题是当我按下 F1 键时,终端帮助窗口打开,我无法捕捉 F1 键按下。我也无法通过信号机制捕捉 ctrl+c 按下。有什么方法可以覆盖终端上的 F1 键以及如何在诅咒模式下使用信号。

0 投票
2 回答
15633 浏览

c - Linux 上的异​​步信号处理程序是如何执行的?

我想确切地知道异步信号处理程序的执行如何在 Linux 上工作。首先,我不清楚哪个线程执行信号处理程序。其次,我想知道使线程执行信号处理程序所遵循的步骤。

关于第一件事,我读过两种不同的、看似矛盾的解释:

  1. Linux 内核,作者 Andries Brouwer,第 5.2 节“接收信号”指出

    当信号到达时,进程被中断,当前寄存器被保存,信号处理程序被调用。当信号处理程序返回时,被中断的活动继续进行。

  2. StackOverflow 问题“处理多线程程序中的异步信号”让我认为 Linux 的行为就像 SCO Unix 的

    当一个信号被传递给一个进程时,如果它被捕获,它将由一个且只有一个满足以下任一条件的线程处理:

    1. 在sigwait (2)系统调用中阻塞的线程,其参数确实包含捕获信号的类型。

    2. 一个线程,其信号掩码包括捕获信号的类型。

    其他注意事项:

    • sigwait (2)中阻塞的线程优先于不阻塞信号类型的线程。
    • 如果多个线程满足这些要求(可能有两个线程正在调用sigwait (2)),那么将选择其中一个。这种选择是应用程序无法预测的。
    • 如果没有线程符合条件,则信号将在进程级别保持“未决”,直到某个线程符合条件。

    此外,Moshe Bar 的“Linux 信号处理模型”指出“异步信号被传递到第一个发现不阻塞信号的线程。”,我解释为信号被传递到其 sigmask包括信号的某个线程.

哪一个是正确的?

关于第二个问题,所选线程的堆栈和寄存器内容会发生什么变化?假设 thread-to-run-the-signal-handler T正在执行一个do_stuff()函数。线程T的堆栈是否直接用于执行信号处理程序(即信号蹦床的地址被推入T的堆栈并且控制流转到信号处理程序)?或者,是否使用了单独的堆栈?它是如何工作的?