我正在构建两个静态c库。每个库都有一个例程,在调用mylib_init();
之后需要每秒运行一次我使用setitimer在每个库中实现了这个,它使用ITIMER_REAL资源和SIGALRM信号。
void Start1msTimer()
{
struct itimerval new;
memset(&new,0, sizeof(new));
new.it_interval.tv_sec=1;
new.it_value.tv_sec=1;
signal (SIGALRM, OneSecTimeout);
setitimer (ITIMER_REAL, &new,NULL);
}
好到目前为止一切顺利。
现在我正在构建一个使用这两个库的示例应用程序,并且正在产生冲突。我已经意识到一个应用程序每个信号只能有一个处理程序,而ITIMER_REAL只能用于一个计时器,而不能同时用于两个计时器。显然现在事情还不行。
对我来说,在每个库中实现时序的更好方法是什么?
一般来说,在库中设置任何信号处理程序是个坏主意吗?
答案 0 :(得分:5)
是的,在库中“使用”应用程序级资源是一个非常糟糕的主意,因为使用该库的应用程序开发人员不会对如何分配资源发表意见。
而且,正如您所发现的,当多个库希望拥有相同的资源时,您会遇到互操作性问题。
解决此问题的一种方法是分解需求,使用函数mylib_update()
并记录应用程序必须每秒调用一次。这就留下了如何对应用程序实现这种基于计时器的更新的问题。
答案 1 :(得分:1)
您可以使用线程+同步方法。您可以编写一个线程,而不是编写信号处理程序。使用信号量,您甚至可以在超时或按需运行事件线程(即应用程序调用发布信号量的库函数)。