2

我正在构建两个静态 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 只能用于一个计时器,不能同时用于两者。所以很明显现在事情不正常了。

在我的每个库中实现计时对我来说有什么更好的方法?

一般来说,在库中包含任何信号处理程序是一个坏主意吗?

4

2 回答 2

5

是的,在库中“用完”应用程序级资源是一个非常糟糕的主意,因为使用该库的应用程序开发人员不会对如何分配资源有发言权。

而且,正如您所发现的,当多个库想要拥有相同的资源时,您会遇到互操作性问题。

解决此问题的一种方法是考虑要求,具有mylib_update()应用程序必须每秒调用一次的函数和文档。这就留下了如何在应用程序所属的应用程序中实现这种基于计时器的更新的问题。

于 2013-05-14T13:03:13.263 回答
1

您可以使用线程+同步方法。您无需编写信号处理程序,而是编写线程。使用信号量,您甚至可以在超时或按需运行事件线程(即应用​​程序调用发布信号量的库函数)。

于 2013-05-14T13:50:01.253 回答