问题标签 [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.
multithreading - 我是否需要检查我的线程是否退出?
我有一个嵌入式应用程序,在 Linux 上作为单个进程运行。
我sigaction()
用来捕获问题,例如分段错误等。
该进程有几个线程,所有这些线程都应该像应用程序一样永远运行。
我的问题是我是否(以及如何)检测其中一个线程是否死亡。
线程中的段错误会被应用程序的sigaction()
处理程序捕获吗?
我正在考虑使用pthread_cleanup_push/pop
,但是这个页面说“如果进程中的任何线程调用 exit、_Exit 或 _exit,那么整个进程都会终止”,所以我想知道是否会在进程级别捕获线程死亡......</p >
c - Do I have to use a signal handler for a Posix timer?
I want to start a timer and have a function called when it expires.
Googling finds lots of examples, including the example in the manual, all of which use sigaction()
to set a signal handler.
However, @Patryk says in this question that we can just
which is shorter, simpler, cleaner, more maintainable ...
What gives? Is this correct? Is it just a wrapper for sigaction()
? Why do the examples explicitly set a signal handler?
Also, if I start a timer either by this method, or by timer_settime
and a signal handler, will cancelling the timer casue the system to remove the association between that timer and the callback, or do I have to do that explicitly?
[Update] You can choose either signals or the method I show in my answer below (or both, but that seems silly). It is a matter of taste. Singals might offer a little more fucntionality, at the cost of complciation.
If all you want to do is start a timer and be notified when it expires, the method in my answer is simplest.
c - sigaction:会员名不正确
我正在将程序的信号处理从 signal() 转换为 sigaction()。
根据UNIX 规范, astruct sigaction
至少应该有 4 个成员;sa_handler
, sa_mask
,sa_flags
和sa_sigaction
.
当我如下定义一个结构时,一切似乎都很正常。
但是当我尝试为 赋值时sa_handler
,该成员不存在。相反,我看到了这个:
我查看了我的signal.h
and bits/sigaction.h
(如果你想知道的话,两者都没有 1092 行),似乎没有任何问题。
我也尝试按原样使用此成员名称,但编译器抱怨
从类型'void(*)(int)'分配给类型'union'时无法比较的类型
这让我觉得我的编译器/IDE 处理结构定义的方式有问题,但这超出了我的诊断范围。
任何帮助或建议将不胜感激。
系统信息:
- Debian 8
- linux 3.16.0-4-amd64
- gcc 4.9.2 (Debian 4.9.2-10)
- 日食-cdt 3.8.1
更新 - 2016 年 8 月 3 日
在此处和此处找到这两个线程,建议分别定义预处理器符号_POSIX_C_SOURCE
和_XOPEN_SOURCE
。我定义了每一个(一次一个)并且都“修复”了不兼容的类型问题(我成功地为 sa.__sigaction_handler 分配了一个值)。但是它们都破坏了我的软件使用类型 intptr_t(用于线程函数管理)的能力,并因此被删除。
但是,这样做可以解决问题。我现在可以为 sa.sa_handler 分配一个变量,而编译器不会抛出错误。IDE 仍将其显示为不存在的成员(与上面链接的图像相同),但恕我直言,这是一个小问题。
c++ - sigio 只处理输入信号而不是输出 c++
我正在开发一个通过串行端口 uart ttyS0 发送信息的嵌入式系统。现在我想从同一个串口接收数据。所以我使用 sigaction 实现了一个信号处理程序。我想使用 SIGIO 信号,但问题是由于我发送的数据而出现中断。那么我可以在阻止输出信号的方法中设置一个条件吗?
c - 由损坏的堆栈触发时捕获 SIGSEGV
我一直在处理一些有问题的代码,并想安装一个 SIGSEGV 处理程序来获取有关崩溃的更多信息。但是,我注意到我的处理程序没有被调用。
我一直在寻找一个原因,它似乎与损坏的堆栈指针值有关(它肯定不会被屏蔽)。这是我编写的一些概念验证代码以进行验证:
这个想法是将 RSP 设置为 0(无效偏移),然后将其用于某些事情。但是,第二个 SIGSEGV 不会被处理程序捕获,而是终止进程。
显然,调用信号处理程序需要一个健全的堆栈指针开始——但为什么呢?这不是反对处理信号的想法吗?有机会解决这个问题吗?
我正在运行 Linux 版本 3.19.0-25-generic。
c - C - 替换“没有这样的文件或目录”消息
我正在尝试制作一个外壳,当它无法执行命令时,它会显示“执行二进制文件时出错:-nameOfBinary-”。但问题是它总是给我“没有这样的文件或目录”的消息。这是我的代码的一部分:
}
使用代码,它总是给我消息“执行二进制文件时出错:没有这样的文件或目录”,这接近我想要的!我该如何解决?提前致谢!
c - sigaction handle signal just once
Is there a way to catch a signal just once with sigaction
structure and function? To be more specific, I would like to simply reset to default a specific signal (SIGINT
). Is it possible to achieve this in a handler?
Edit
So, something like this would be correct:
c - 为什么我不应该包括,当我这样做时如何忽略错误?
我目前正在尝试使用 Score-P 分析工具检测 SPEC OMP 2012 基准测试套件的一部分,但出现错误。具体来说:
根据我在这里找到的信息,问题是当我使用-std=c99
(使用gcc 6.2.1
)编译时,编译器无法识别sigaction
,因为它不在 C99 规范中。
有趣的是,当我在没有Score-P 的情况下编译时,我根本没有这个问题。但那是另一回事了。
说了这么多,我仍然需要检测这个程序。我也不关心便携性。而且我知道您不应该直接包含<bits/sigaction.h>
. 考虑到这一点,我仍然想知道:
我如何忽略
#error
一旦我尝试编译就会抛出的问题>为什么会存在这个错误?
c - gnu99 仅在 Windows 上不知道存储大小,在 Linux 上不知道
我正在使用 C 语言编写代码sigaction
。在 Windows 上使用 minGW 编译。
我注意到 c99 不支持,所以我在编译时sigaction
使用了该标志。
为什么它只在 Windows 而不是 Linux 上给我错误消息“'newact' 的存储大小未知”?仅供
参考-std=gnu99
newact
struct sigaction
c - 如何让信号处理程序打印时间过去?
我正在编写一个具有 sigaction 处理程序的 C 程序。如果 SIGALRM 在一段时间内没有出现,它也有一个 itimerval。
处理程序应
- 打印完成的无限循环总数
- 打印经过的时间
- 退出(1);
我注意到信号处理程序不采用自定义参数,所以我有一个全局循环计数器。
我的问题是:我如何获得经过的时间?我可以从计时器中获得这些信息吗?我不完全了解计时器的用法。
此外,代码在终止之前的 fprintf 调用之后打印 1 个额外的整数(来自循环)。如何解决?
代码: