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

c++ - 是否可以在 C++ 类中使用信号?

我正在做这样的事情:

我正在使用 gcc 在 Ubuntu 上工作。

但它不会编译。它抱怨:

错误:与类型的参数void (MyClass::)(int)不同意void (*) (int)

有什么线索吗?或者也许只是我不能在类中使用信号?信号只允许在 C 中使用吗?

错误消息是近似翻译,因为我的编译器不是英文的。

0 投票
3 回答
2779 浏览

signal-handling - 为共享库或 DLL 编写信号处理程序?

我有一个应用程序 A(某公司 X)。这个应用程序允许我通过编写自己的函数来扩展功能。

我告诉应用程序 A 在应用程序 A 的配置文件中调用我的用户函数(这是它知道应用程序 A 必须调用用户编写的函数的方式)。appl A 使用函数指针,我必须在调用我的用户编写的函数之前向 Application A 注册。

如果我的用户在生产中编写的函数出现错误或故障,Appl A 将停止运行。例如,如果我的用户编写的函数中有分段错误。

所以应用程序 A 将从共享的 DLL 文件中加载我的用户编写的函数。这意味着我的用户编写的函数将在应用程序 A 的进程地址空间中运行。

我希望处理某些信号,如分段错误、除以零和堆栈溢出,但应用程序 A 有自己为此编写的信号处理程序,

如何编写自己的信号处理程序来捕获用户编写的函数中的异常,以便我可以优雅地清理而不影响应用程序 A 的大部分内容?由于我的用户函数将在应用程序 A 的进程中调用,因此操作系统将调用在应用程序 A 中编写的信号处理程序,而不是我的用户函数。

我怎样才能改变这个?我希望操作系统调用在我的函数中编写的信号处理程序,但仅用于由我的函数引发的信号,这本质上是异步的。

注意:我没有应用程序 A 的源代码,我无法对其进行任何更改,因为它由不同的公司控制。

我将在 Linux、solaris 和可能的 Windows 平台上使用 C,并且仅使用 C。

0 投票
4 回答
757 浏览

c++ - 创建全局已知并自动删除的临时目录(C++)?

在 C++ 中,我有一些函数需要写入临时目录。理想情况下,只创建一个它们都写入的临时目录(以最小化 I/O 开销)。该目录应在程序退出时自动删除。

但是,我不想在主函数中处理临时目录的创建和删除,因为我认为只有实际使用该目录的函数才应该负责它的创建和删除。并且 main 函数并不一定知道使用了一个临时目录。

这是我尝试过的(参见下面的代码): 可以从任何地方全局调用的 getTempDir() 函数仅在第一次调用时创建一个目录,并在每次调用时返回目录名称。在第一次调用时,它还会为一个小 DirRemover 对象创建一个静态 boost::shared_ptr,该对象的析构函数将删除目录。程序退出时会自动调用该析构函数。

问题是它不会在程序不成功退出或杀死等时调用 FileRemover 析构函数。有更好的解决方案吗?

这是代码:

0 投票
4 回答
1466 浏览

perl - 包装脚本应该将哪些信号传递给子程序?

如果我有一个脚本是另一个程序的包装器(例如,守护程序包装器mathematica 的包装器),有时在包装器程序中捕获信号并将它们传递给子程序很有用。例如,这里有一些处理 INT(中断)信号的 Perl 代码,因此如果您在启动包装器后执行 ctrl-C,子程序也会被中断:

在程序可能处理的[所有可能的信号]( http://en.wikipedia.org/wiki/Signal_(computing)中,包装器脚本应该传递哪些信号?
还有什么好的包装器应该做的吗?

编辑:最初这个问题是询问如何传递所有可能的信号。感谢最初的答案,我了解到这不是正确的问题。

编辑:我想出了是什么让我在这里循环。Mathematica 显然脱离了它的父进程。所以我必须明确地传递各种终止信号:

通常这不是必需的,因为子进程会自动传递这些信号(感谢让我直截了当的答案!)。所以现在我想知道为什么(以及如何)mathematica 脱离自身......

0 投票
4 回答
569 浏览

algorithm - 以 10 为底的数字显示算法 - 每次刷新的最小更改

快速总结:

我正在寻找一种算法来显示四位数的速度信号,这样每次显示更新时都会更改(十进制)的最小位数。

例如:


细节:

我正在做一个项目,我需要在四位 LCD 显示器上显示速度信号(0 到 3000 RPM 之间)。理想的显示解决方案是模拟仪表,但我坚持使用数字显示。显示器将由机器操作员阅读,我希望阅读起来尽可能愉快。

操作员并不真正关心信号的确切值。他会想知道这个值是多少(精确到 10 RPM),并且他会想看到它随着机器运行的变化而上下波动。他不想看到它到处乱跳。

这是我到目前为止所做的:

  • 将数字四舍五入到最接近的 10 RPM,以便最后一位始终为 0
  • 过滤信号,使电噪声和正常的传感器波动不会导致读数一次跳跃超过 10 RPM。
  • 为信号添加了一个 +/-10 RPM 滞后,以避免在相同值上摆动的情况(例如:990 - 1000)

当信号稳定时(大约 75% 的时间),这已经很好地清理了事情,但是当信号从一个稳定状态移动到另一个稳定状态时,我仍然看到很多不必要的变化。当信号从 100 RPM 变为 1000 RPM(例如)时,它会一路经过很多数字。由于实际阅读和理解数字需要一点时间,因此达到所有这些中间状态似乎没有什么意义。我尝试简单地降低显示器的更新率,但这并没有产生令人满意的结果。它同时让显示器“感觉”迟缓和跳跃。在数字发生变化之前会有明显的延迟,然后它们会大幅跃升(100、340、620、980、1000)。


提议:

我希望显示器的行为如示例所示:

  1. 显示每秒更新两次
  2. 从一种稳态过渡到另一种稳态的时间不应超过 2 秒。
  3. 如果输入信号高于当前显示值,则显示信号应增加,但绝不应高于输入信号值。
  4. 如果输入信号低于当前显示值,则显示信号应减小,但决不能低于输入信号值。
  5. 每次更新应更改的最小位数(最好只有一位)
  6. 应先改变高位数字,使显示信号与输入信号的差异尽快减小

你能想出,或者你知道根据上述规则输出“正确”的 4 位十进制数的算法吗?

伪代码中的函数原型看起来像这样:

对不起,文字墙。我想记录我迄今为止的进展,以便任何回答这个问题的人都避免覆盖我已经经历过的基础。

0 投票
3 回答
285 浏览

c - 收到神秘 SIGINT 的应用程序

我们有一个用 C 语言为几个不同的 UNIX 平台编写的小型守护程序应用程序(这个问题发生在 SunOS 5.10 中),它基本上只是打开一个串行端口,然后侦听通过所述端口进入的信息。

在这个特定的实例中,守护进程似乎读取了通过串行端口发送的单个传输(如文件的数据),然后它接收到一个 SIGINT。每次都会发生这种情况。其他客户非常相似地使用此设置,但未收到 SIGINT。很明显,用户没有按 Ctrl-C。我们有一个相对简单的信号处理程序,所以我们肯定知道这就是正在发生的事情。

还有什么可能导致这种情况?谷歌搜索并查看这里的问题,我找不到关于可能导致 SIGINT 的其他事情的太多解释。我还查看了代码,发现没有调用 raise() 并且只有一个调用 kill(pid, 0) 无论如何都不会发送 SIGINT。

任何想法或见解肯定会受到赞赏。

0 投票
1 回答
5752 浏览

python - 我可以将 SIGINT 发送到 Windows 上的 Python 子进程吗?

我有一个 Python 脚本在 Windows 上管理一个 gdb 进程,我需要能够向生成的进程发送一个 SIGINT 以停止目标进程(由 gdb 管理)

Win32 中似乎只有 SIGTERM 可用,但很明显,如果我从控制台运行 gdb 并按 Ctrl+C,它认为它正在接收 SIGINT。有没有办法可以伪造这个,以便该功能在所有平台上都可用?

(我正在使用 subprocess 模块和 python 2.5/2.6)

0 投票
2 回答
2351 浏览

perl - 为 fork() 的守护进程管理信号处理

我想在 perl 中编写一个强大的守护程序,它将在 Linux 上运行,并遵循这个出色答案中描述的模板。但是我的情况有一些不同:首先我使用的是Parallel::ForkManager start() and next;派生一个事件,紧随其后exec('handle_event.pl')

在这种情况下,我有以下问题:

  1. 我应该在哪里定义我的信号处理程序。我应该在父级(守护进程)中定义它们并假设它们将在子级中继承吗?
  2. 如果我运行exec('handle_event.pl'),处理程序是否会跨 exec 继承(我知道它们是跨 exec 继承的fork)?
  3. 如果我重新定义一个新的信号处理程序,handle_event.pl这个定义会覆盖父级中定义的那个吗?
  4. 在这种情况下,最佳实践是什么?

谢谢

0 投票
8 回答
34992 浏览

python - Python - 捕获所有信号

在 Linux 下的 python 2.6 中,我可以使用以下方法来处理 TERM 信号:

有没有办法为进程接收到的所有信号设置一个处理程序,而不是一次设置一个?

0 投票
3 回答
832 浏览

c - 有没有办法测试我是否在信号处理程序中?

我必须处理一个可以从大型项目中的不同位置调用的日志记录模块。我遇到的问题是,有时可以从信号处理程序中执行的代码调用模块。通常,日志记录模块使用 localtime() 和 strftime() 包含时间数据,但当然这些调用不是异步信号安全的,如果从信号处理程序中调用可能会导致死锁。有没有办法(在 GNU/Linux 系统上)来判断我的代码当前是否在信号处理程序上下文中执行,除了例如让每个信号处理程序在处理时设置一个标志?我认为简化我们的信号处理程序会更好,但在这种情况下,我无法选择调用日志模块的位置。