问题标签 [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 回答
205 浏览

c - 服务器使用信号 SIGUSR1 和 SIGUSR2 从客户端接收和显示字符串无法处理大量符号

我有一个学校的任务,我需要编写一个客户端,它将使用信号(仅 SIGUSR1 作为 1 或 SIGUSR2 作为 0)向服务器发送字符串,然后服务器应该显示这个字符串。问题是服务器通常只能处理少量的符号。在其他情况下,它会在客户端暂停或仅显示奇怪的符号。我尝试使用客户端中的全局变量以不同方式编写以从服务器确认(有和没有暂停客户端),使用usleep()(100/600/1000/10000),使用pause(),结果总是与我快速调用时相同客户一次又一次。

我正在使用 VirtualBox Ubuntu 编写它。

UPD:sleep (5)使用而不是pause()在客户端解决问题并增加到usleep()1000

客户:

服务器:

0 投票
1 回答
34 浏览

linux - 为 SIGSEGV 注册信号处理程序并且仍然能够从操作系统创建完整的故障转储

我们使用标准模式为 SIGSEGV 注册自定义信号处理程序和sigaction,然后在发生分段错误时使用回溯函数遍历堆栈并将其打印到某个文件。在日志中有回溯是一个不错的功能,但它会禁用操作系统写入崩溃程序的完整转储,这非常有用。怎么可能既捕获 SIGSEGV,进行自定义处理,又使操作系统创建完整转储,就像在默认操作的情况下一样?

例如,我可以调用记住指向默认处理程序的 oldact 指针(如 man 中所述),然后直接从自定义处理程序中调用它吗?不用说,我们需要 crash 来指示它发生的确切位置。因此,例如将处理程序重新注册到旧值并在其他地方隐式地使程序崩溃是行不通的。

0 投票
1 回答
18 浏览

c - 获取 sigaction 结构

尝试借助 Visual Studio 2019 在我通过 ssh 连接的 Raspberry Pi 机器上构建 paho_c_pub.c。<signal.h> 中的代码使用structure sigaction编译器不可见:

在控制台中构建代码时没有这样的错误:

Visual Studio C 项目配置有什么问题?

0 投票
0 回答
16 浏览

signals - 使用 .NET 应用程序中的 sigaction 忽略 SIGTERM 等 linux 进程信号

我对 .NET 互操作不是很熟悉。我正在尝试使用对 .NET 的调用来实现忽略 .NET 中的 linux 进程信号sigaction

我可以提出的互操作定义如下:

在尝试编写忽略 SIGTERM 的示例实现时,我尝试

Marshal.AllocHGlobal这是在:上引发错误System.ArgumentException: Type 'myProject.sigaction' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed

我的互操作定义错了吗?我在做一些没有意义的事情吗?

0 投票
2 回答
29 浏览

c - SIGINFO 的 si_pid 在多次调用同一函数后将自身设置为 0

我正在开发一个简单的项目,该项目使 2 个进程使用信号相互通信。更具体地说,我将sigaction与标志SA_SIGINFO一起使用,以便每个进程都可以识别谁向它发送了信号并进行回复。问题是,在他们互相调用几次之后(它可能会发生很大变化,有时会发生在 3 次交换之后,其他时候会发生在 700 次之后),siginfo 返回一个等于 0 的 si_pid。这是我用来让他们交流的两个代码。一、“服务器”

第二,“客户”

笔记:

  • 如果我删除该行if (info ->si_pid != 0),则未接收信号的进程将永远暂停(呃!),有趣的是,另一个进程继续运行,就像它永远接收信号一样(不是杜赫!)。

  • 我环顾四周以了解如何使用 sigfillset 或 sigaddset 来防止在我的处理程序仍在工作时出现任何传入信号,似乎没有什么能破坏这种行为。

  • 如果您想知道,我正在 MacBook 上运行这个程序。

  • 我还在 Linux(基于 Ubuntu 的发行版)上运行了这些程序,但那里没有“错误”。这对我来说似乎很奇怪。

  • 如果你想测试代码,这很简单:用不同的名称(例如gcc -o server server.c && gcc -o client client.c)编译每个程序,首先运行服务器,然后使用服务器的 PID 作为参数运行客户端。

  • 在我因使用带有信号的printf而受到抨击之前,我知道在 printf 执行期间信号中断的情况下不建议这样做(请参阅如何避免printf()在信号处理程序中使用?),但理论上,处理程序在发出信号时完成,所以它应该运作良好。我尝试使用write函数,它具有相同的行为。

如果你有任何线索,我可以按照这个在没有打嗝的情况下工作,我将非常感激。