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

c - 为什么我每次分叉后都抓不到 SIGCHLD?

我正在尝试创建 4 个子进程,直到孩子死,父母应该等待。我写了一个程序,但是当我运行这段代码时,十分之一,它无法从每个孩子那里捕获 SIGCHLD,然后我的程序进入无限循环。它发生真的很少,但仍然..

你能告诉我为什么以及如何解决它吗?

这是我的代码。

我尝试了一些新的东西,但它也不起作用..

0 投票
1 回答
226 浏览

c - 我想使用 sigaction(),但我有问题

我想制作一个程序,如果进程收到 SIGQUIT,打印一些消息并终止进程。这是我的代码,

我的预期结果是

输入 SIGQUIT:^\ 收到 SIGQUIT

并终止进程,

但实际结果是

在此处输入图像描述

在接收 SIGQUIT 之前未打印消息“输入 SIGQUIT:”

我想知道为什么。。

0 投票
1 回答
153 浏览

c - linux C语言。setjmp longjmp 警报

执行

我的代码

我认为这段代码的结果是

在主要。在处理程序中。在主要。在处理程序中。在主要。在处理程序中。在主要。在处理程序中。. . .

但它没有用。处理程序中未设置警报功能。当我删除 setjmp、longjmp 时,它运行良好。但我不想删除它们。setjmp 是否影响设置报警功能?如何解决这个问题。

0 投票
2 回答
118 浏览

linux - 如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?

我想检测QProcess我启动的是否由SIGKILL或外部终止SIGTERM。当我编写自己启动的进程时,这对于区分崩溃(错误)和外部干扰非常重要。

我尝试通过连接到的插槽注册监视的进程QProcess::started并设置SIGCHLD处理程序(使用sigaction)以使用waitpid. 问题是waitpid清除了内部内核数据结构,即使我将处理程序正确链接到QProcess实现上的处理程序,后者也无法获得子状态,waitpid因为对该 pid 的任何下一次调用都失败了。将进程状态设置为QProcess::ProcessState::NotRunningthroughQProcess::setProcessState可以避免挂起一般的调用waitForFinished,但是有些极端情况我还无法修复。

我想知道是否没有更好的方法来做到这一点,除了修改 Qt 的源代码以将状态信息存储在某处。

注意:我知道崩溃也会以一个信号终止,即SIGABRT. 这里的主要问题是,aSIGKILL可能会告诉我 Linux 中的内存不足杀手是导致进程终止的原因。

0 投票
1 回答
531 浏览

linux - 在信号处理程序中获取导致分段错误的寄存器

我知道:

  • 当使用和 a (而不是)安装SIGSEGV信号处理程序时,信号处理程序会接收 a ,其中的是发生故障的地址。sigactionsa_sigactionsa_handlersiginfo_t*si_addr

  • 使用ucontext_t我们可以检查寄存器的值,例如指令指针,尽管不是以独立于平台的方式(Linux 信号处理。如何获取中断指令的地址?)。

我的问题:我们还能知道哪个寄存器导致了错误吗?鉴于我们没有内存到内存的移动,这应该只有一个寄存器(毕竟也只有一个si_addr)。当然,我可以检查所有寄存器并搜索si_addr,但可能不止一个匹配项。

我会对不独立于平台的解决方案感到非常满意。

0 投票
1 回答
190 浏览

c - 我可以在 C 中使用 sigaction 的标志 siginfo 和 SIGCHLD 来获得终止进程的信号 int 常量(如 SIGINT 或 SIGKILL)吗?

我试图弄清楚我是否可以使用传递给标志设置为 SA_SIGINFO 的 sigaction 的自定义 SIGCHLD 处理程序来获得终止子进程的信号。据我了解,si_status 应该根据 si_code 值报告退出值或信号值。

这是 SIGCHLD 处理程序的代码:

现在我的问题是,首先:可以这样做吗?

第二:如果是,我可以使用 si_status 和 si_code 吗?

0 投票
0 回答
60 浏览

multithreading - 如何在大型多线程 C 程序中找到 SEGFAULT 的原因?

我正在使用用于 Linux 嵌入式系统的多线程程序,该程序通过 SEGFAULT 信号非常随机地崩溃。

我需要在不使用 gdb 的情况下找到问题,因为崩溃仅发生在生产环境下,从不在测试期间发生。

我知道程序的符号表,我在主线程中使用 sigaction() 和 backtrace() 但我没有得到足够的信息。回溯线来自 sigaction 函数本身。我允许捕获 50 帧,并在 gcc 中使用 -g 标志进行编译:

由于程序运行 15 个线程,我想知道信号来自哪个线程,以便限制可能性。仅供参考,主线程创建一个分叉,该分叉创建剩余的 14 个线程。

我怎样才能做到这一点?我可以用我已有的信息做什么?

谢谢大家的帮助

PD:我也尝试过 Core-dump 文件,但它没有生成,因为这个选项没有包含在内核编译中,我无法修改它。

0 投票
1 回答
139 浏览

c - 接收到带有 sigaction 的信号时重启进程

我试图让我的进程在收到SIGUSR1. 由于SIGINT更容易测试,我正在使用它。

这是代码:

不幸的是,这只适用于第一次接收到信号。之后,它什么也不做。我认为SA_NODEFER旗帜应该按照我想要的方式进行这项工作,但事实并非如此。

此外,当我尝试使用 时SIGUSR1,它只会终止该过程。

0 投票
1 回答
55 浏览

linux - SIGACTION 处理程序在中断后重复加载

嗨stackoverflow家族,

我正在做一个 uni 任务来制作一个 linux 程序来读取密码并保护它,如果用户在此期间中断密码,我会再次“重新读取”​​密码。

这是我用于捕获处理程序的代码。

这是主程序

我还应该阻止除 SIGINT 和 SIGQUIT 之外的所有信号,不确定我是否使用掩码正确完成了它。我现在遇到的问题是:在密码读取过程中中断后,进程停止。没关系。但是在我使用“fg”命令继续之后,我的处理程序只写输出并且程序结束,但我需要它再次运行fgets(passwd, MAX_SIZE, stdin)(它停止的地方)。

我想我可能没有正确设置 old_action,但我读过的手册并没有真正让我更清楚。谁能伸出援助之手?

0 投票
1 回答
50 浏览

c - 如果发送太快则忽略信号

我有以下代码:

会发生什么:有时第二辆救护车的 sigqueue(getppid(), SIGUSR1, signalValueInt); 没有收到,输出类似于以下内容:

  1. 救护车[20050]结束。// main() 打印出这个
  2. 救护车[20051]结束。// main() 打印出这个
  3. // handler() 只用 write() 打印一次!
  4. 总部回家了!// main() 打印出这个

我知道信号丢失了,因为两个信号一个接一个的来得太快了,而且操作系统。认为这是一个错误重复,所以它被忽略了。

我的问题是:

有没有办法告诉操作系统不要这样做?

我不想为同一目的使用两个不同的信号(例如:SIGUSR1 和 SIGUSR2),我也不想在其中一个子进程中使用延迟。