问题标签 [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.
c - 为什么我每次分叉后都抓不到 SIGCHLD?
我正在尝试创建 4 个子进程,直到孩子死,父母应该等待。我写了一个程序,但是当我运行这段代码时,十分之一,它无法从每个孩子那里捕获 SIGCHLD,然后我的程序进入无限循环。它发生真的很少,但仍然..
你能告诉我为什么以及如何解决它吗?
这是我的代码。
我尝试了一些新的东西,但它也不起作用..
c - 我想使用 sigaction(),但我有问题
我想制作一个程序,如果进程收到 SIGQUIT,打印一些消息并终止进程。这是我的代码,
我的预期结果是
输入 SIGQUIT:^\ 收到 SIGQUIT
并终止进程,
但实际结果是
在接收 SIGQUIT 之前未打印消息“输入 SIGQUIT:”
我想知道为什么。。
linux - 如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?
我想检测QProcess
我启动的是否由SIGKILL
或外部终止SIGTERM
。当我编写自己启动的进程时,这对于区分崩溃(错误)和外部干扰非常重要。
我尝试通过连接到的插槽注册监视的进程QProcess::started
并设置SIGCHLD
处理程序(使用sigaction
)以使用waitpid
. 问题是waitpid
清除了内部内核数据结构,即使我将处理程序正确链接到QProcess
实现上的处理程序,后者也无法获得子状态,waitpid
因为对该 pid 的任何下一次调用都失败了。将进程状态设置为QProcess::ProcessState::NotRunning
throughQProcess::setProcessState
可以避免挂起一般的调用waitForFinished
,但是有些极端情况我还无法修复。
我想知道是否没有更好的方法来做到这一点,除了修改 Qt 的源代码以将状态信息存储在某处。
注意:我知道崩溃也会以一个信号终止,即SIGABRT
. 这里的主要问题是,aSIGKILL
可能会告诉我 Linux 中的内存不足杀手是导致进程终止的原因。
linux - 在信号处理程序中获取导致分段错误的寄存器
我知道:
当使用和 a (而不是)安装
SIGSEGV
信号处理程序时,信号处理程序会接收 a ,其中的是发生故障的地址。sigaction
sa_sigaction
sa_handler
siginfo_t*
si_addr
使用
ucontext_t
我们可以检查寄存器的值,例如指令指针,尽管不是以独立于平台的方式(Linux 信号处理。如何获取中断指令的地址?)。
我的问题:我们还能知道哪个寄存器导致了错误吗?鉴于我们没有内存到内存的移动,这应该只有一个寄存器(毕竟也只有一个si_addr
)。当然,我可以检查所有寄存器并搜索si_addr
,但可能不止一个匹配项。
我会对不独立于平台的解决方案感到非常满意。
c - 我可以在 C 中使用 sigaction 的标志 siginfo 和 SIGCHLD 来获得终止进程的信号 int 常量(如 SIGINT 或 SIGKILL)吗?
我试图弄清楚我是否可以使用传递给标志设置为 SA_SIGINFO 的 sigaction 的自定义 SIGCHLD 处理程序来获得终止子进程的信号。据我了解,si_status 应该根据 si_code 值报告退出值或信号值。
这是 SIGCHLD 处理程序的代码:
现在我的问题是,首先:可以这样做吗?
第二:如果是,我可以使用 si_status 和 si_code 吗?
multithreading - 如何在大型多线程 C 程序中找到 SEGFAULT 的原因?
我正在使用用于 Linux 嵌入式系统的多线程程序,该程序通过 SEGFAULT 信号非常随机地崩溃。
我需要在不使用 gdb 的情况下找到问题,因为崩溃仅发生在生产环境下,从不在测试期间发生。
我知道程序的符号表,我在主线程中使用 sigaction() 和 backtrace() 但我没有得到足够的信息。回溯线来自 sigaction 函数本身。我允许捕获 50 帧,并在 gcc 中使用 -g 标志进行编译:
由于程序运行 15 个线程,我想知道信号来自哪个线程,以便限制可能性。仅供参考,主线程创建一个分叉,该分叉创建剩余的 14 个线程。
我怎样才能做到这一点?我可以用我已有的信息做什么?
谢谢大家的帮助
PD:我也尝试过 Core-dump 文件,但它没有生成,因为这个选项没有包含在内核编译中,我无法修改它。
c - 接收到带有 sigaction 的信号时重启进程
我试图让我的进程在收到SIGUSR1
. 由于SIGINT
更容易测试,我正在使用它。
这是代码:
不幸的是,这只适用于第一次接收到信号。之后,它什么也不做。我认为SA_NODEFER
旗帜应该按照我想要的方式进行这项工作,但事实并非如此。
此外,当我尝试使用 时SIGUSR1
,它只会终止该过程。
linux - SIGACTION 处理程序在中断后重复加载
嗨stackoverflow家族,
我正在做一个 uni 任务来制作一个 linux 程序来读取密码并保护它,如果用户在此期间中断密码,我会再次“重新读取”密码。
这是我用于捕获处理程序的代码。
这是主程序
我还应该阻止除 SIGINT 和 SIGQUIT 之外的所有信号,不确定我是否使用掩码正确完成了它。我现在遇到的问题是:在密码读取过程中中断后,进程停止。没关系。但是在我使用“fg”命令继续之后,我的处理程序只写输出并且程序结束,但我需要它再次运行fgets(passwd, MAX_SIZE, stdin)(它停止的地方)。
我想我可能没有正确设置 old_action,但我读过的手册并没有真正让我更清楚。谁能伸出援助之手?
c - 如果发送太快则忽略信号
我有以下代码:
会发生什么:有时第二辆救护车的 sigqueue(getppid(), SIGUSR1, signalValueInt); 没有收到,输出类似于以下内容:
- 救护车[20050]结束。// main() 打印出这个
- 救护车[20051]结束。// main() 打印出这个
- // handler() 只用 write() 打印一次!
- 总部回家了!// main() 打印出这个
我知道信号丢失了,因为两个信号一个接一个的来得太快了,而且操作系统。认为这是一个错误重复,所以它被忽略了。
我的问题是:
有没有办法告诉操作系统不要这样做?
我不想为同一目的使用两个不同的信号(例如:SIGUSR1 和 SIGUSR2),我也不想在其中一个子进程中使用延迟。