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

multithreading - 我是否需要检查我的线程是否退出?

我有一个嵌入式应用程序,在 Linux 上作为单个进程运行。

sigaction()用来捕获问题,例如分段错误等。

该进程有几个线程,所有这些线程都应该像应用程序一样永远运行。

我的问题是我是否(以及如何)检测其中一个线程是否死亡。

线程中的段错误会被应用程序的sigaction()处理程序捕获吗?

我正在考虑使用pthread_cleanup_push/pop,但是这个页面说“如果进程中的任何线程调用 exit、_Exit 或 _exit,那么整个进程都会终止”,所以我想知道是否会在进程级别捕获线程死亡......</p >

0 投票
3 回答
4938 浏览

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.

0 投票
2 回答
1841 浏览

c - sigaction:会员名不正确

我正在将程序的信号处理从 signal() 转换为 sigaction()。

根据UNIX 规范, astruct sigaction至少应该有 4 个成员;sa_handler, sa_mask,sa_flagssa_sigaction.

当我如下定义一个结构时,一切似乎都很正常。

但是当我尝试为 赋值时sa_handler,该成员不存在。相反,我看到了这个: 图片:显示 __sigaction_handler : {sigaction.h:1092} 而不是 sa_handler

我查看了我的signal.hand 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 仍将其显示为不存在的成员(与上面链接的图像相同),但恕我直言,这是一个小问题。

0 投票
0 回答
249 浏览

c++ - sigio 只处理输入信号而不是输出 c++

我正在开发一个通过串行端口 uart ttyS0 发送信息的嵌入式系统。现在我想从同一个串口接收数据。所以我使用 sigaction 实现了一个信号处理程序。我想使用 SIGIO 信号,但问题是由于我发送的数据而出现中断。那么我可以在阻止输出信号的方法中设置一个条件吗?

0 投票
1 回答
402 浏览

c - 由损坏的堆栈触发时捕获 SIGSEGV

我一直在处理一些有问题的代码,并想安装一个 SIGSEGV 处理程序来获取有关崩溃的更多信息。但是,我注意到我的处理程序没有被调用。

我一直在寻找一个原因,它似乎与损坏的堆栈指针值有关(它肯定不会被屏蔽)。这是我编写的一些概念验证代码以进行验证:

这个想法是将 RSP 设置为 0(无效偏移),然后将其用于某些事情。但是,第二个 SIGSEGV 不会被处理程序捕获,而是终止进程。

显然,调用信号处理程序需要一个健全的堆栈指针开始——但为什么呢?这不是反对处理信号的想法吗?有机会解决这个问题吗?

我正在运行 Linux 版本 3.19.0-25-generic。

0 投票
1 回答
807 浏览

c - C - 替换“没有这样的文件或目录”消息

我正在尝试制作一个外壳,当它无法执行命令时,它会显示“执行二进制文件时出错:-nameOfBinary-”。但问题是它总是给我“没有这样的文件或目录”的消息。这是我的代码的一部分:

}

使用代码,它总是给我消息“执行二进制文件时出错:没有这样的文件或目录”,这接近我想要的!我该如何解决?提前致谢!

0 投票
3 回答
1447 浏览

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:

0 投票
0 回答
185 浏览

c - 为什么我不应该包括,当我这样做时如何忽略错误?

我目前正在尝试使用 Score-P 分析工具检测 SPEC OMP 2012 基准测试套件的一部分,但出现错误。具体来说:

根据我在这里找到的信息,问题是当我使用-std=c99(使用gcc 6.2.1)编译时,编译器无法识别sigaction,因为它不在 C99 规范中。

有趣的是,当我在没有Score-P 的情况下编译时,我根本没有这个问题。但那是另一回事了。

说了这么多,我仍然需要检测这个程序。我也不关心便携性。而且我知道您不应该直接包含<bits/sigaction.h>. 考虑到这一点,我仍然想知道:

  1. 我如何忽略#error一旦我尝试编译就会抛出的问题>

  2. 为什么会存在这个错误?

0 投票
0 回答
279 浏览

c - gnu99 仅在 Windows 上不知道存储大小,在 Linux 上不知道

我正在使用 C 语言编写代码sigaction。在 Windows 上使用 minGW 编译。
我注意到 c99 不支持,所以我在编译时sigaction使用了该标志。 为什么它只在 Windows 而不是 Linux 上给我错误消息“'newact' 的存储大小未知”?仅供 参考-std=gnu99

newactstruct sigaction

0 投票
1 回答
563 浏览

c - 如何让信号处理程序打印时间过去?

我正在编写一个具有 sigaction 处理程序的 C 程序。如果 SIGALRM 在一段时间内没有出现,它也有一个 itimerval。

处理程序应

  1. 打印完成的无限循环总数
  2. 打印经过的时间
  3. 退出(1);

我注意到信号处理程序不采用自定义参数,所以我有一个全局循环计数器。
我的问题是:我如何获得经过的时间?我可以从计时器中获得这些信息吗?我不完全了解计时器的用法。
此外,代码在终止之前的 fprintf 调用之后打印 1 个额外的整数(来自循环)。如何解决?

代码: