我的要求是:我的工具中有一个信号处理程序,它在某个特定的时间间隔之间注册和使用(我使用的是计时器)。
现在这个信号处理程序不应该允许任何其他处理程序在这个处理程序注册之后再注册。(但是这个限制只在很短的时间内,意味着在这段时间之后用户可以自由地调用他自己的处理程序)
有什么办法可以做到这一点吗?
sigset_t mask;
struct sigaction sa;
printf("Establishing handler for signal %d\n", SIG);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler; // This handler should override all handlers
sigaction(SIG, &sa, NULL);
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGUSR1;
注意:我的工具实际上是用C编写的,但概念非常接近,因为更多的人熟悉它,我也用C添加了一个C标签请随时要求更多说明(如果您需要)
4条答案
按热度按时间iswrvxsc1#
我假设你正在写一个库。答案是不,不,不,不!只要在文档中写上客户端代码不应该为那个信号注册一个处理程序。如果你不能相信你的库的用户不会破坏东西,那么你应该写应用程序,而不是库。
无论你做了什么来使你的处理程序优先于其他处理程序,如果其他代码做了同样的事情,它都不会起作用。这里有一篇非常相关的博客文章,关于那些想做一个“最顶层窗口”(有点像“最高优先级”的信号处理程序)的Windows开发人员。
https://devblogs.microsoft.com/oldnewthing/20110310-00/?p=11253
P.S.在Linux中,没有好的方法可以在比进程级别更精细的级别上给予不同级别的权限。
**P.P.S.**澄清一下,如果我的代码在你的进程中运行,那么你什么都做不了。你已经输了。我的代码可以访问你的私有成员变量,释放你的内存,关闭你的文件,卸载你的库。(你可以写内核代码,或者在虚拟化中运行所有东西,但那会很糟糕。)
pbwdgjma2#
如果处理信号是一个问题,那么摆脱信号!你可以使用选择作为一种睡眠的方式与wahtevery精度你的os粒度允许。调用选择与空stes(没有描述符在任何集)和一个有效的超时基本上是一个阻塞系统调用与定时下限。
如果你不想阻塞,那么你可以把计时器放在它自己的线程中,并使用信号量或互斥量或任何同步。
pqwbnv8z3#
最简单的答案是不要使用信号作为计时器,你可以简单地创建一个带有
SIGEV_THREAD
传递的POSIX计时器(handler运行在一个新的线程中,而不是一个信号处理器中)或创建自己的线程和nanosleep
在其中所需的时间间隔。这有一个好处,即计时器过期处理器不仅限于异步信号安全函数,你不需要不必担心安装冲突的信号处理程序。13z8s7eq4#
这是可以实现的,事实上,我已经通过在实际的sigaction Package 器周围编写sigaction Package 器并使用
dlsym
和RTLD_NEXT
技术来实现。下面是我的 Package 器的代码片段:
最后,我想每个人都知道,如何使用dlsym获得libc句柄:-)不幸的是,没有人能在“stackoverflow”中给予我这个想法。