我正在将POSIX调用用于timer,即timer_create()。 应用程序需要大量的计时器,因此我为此测试了不同的场景,我发现在“ ULIMIT_SIGPENDING”之后,create_timer()函数均返回错误,错误号为EAGAIN(errno 11)。这意味着系统有最大数量的待处理信号。
我想解决这个问题时,我走得更远,编写了一个简单的计时器应用程序,其中信号挂起的可能性非常小。
sudo代码如下,
void CreateTimerFirstTime()
{
//create timer and on time out call function TimeOut()
}
void TimeOut
{
//create timer and on time out call function TimeOut()
//print timer no
}
通过上面的练习,我知道ULIMIT_SIGPENDING与创建的计时器和TimedOut相同,尽管在此之后create_timers()给出错误“资源暂时不可用”
注意:在应用程序中,我还通过命令“ lsof”检查了文件描述符列表,并且该文件描述符没有太多。
所以我的问题是。
为什么系统返回错误,即每个计时器都正确设置了Timedout时,最大信号仍处于等待状态?
在不使ULIMIT_SIGPENDING为无限的情况下该问题的解决方案是什么?
现在,如果该应用程序中有信号待处理,有什么办法可以通过任何命令或类似的东西看到那些信号?
任何帮助将不胜感激。 谢谢
编辑1:
根据我的第三个问题,我正在寻找查看待处理信号的方法,发现没有待处理信号。
注意:我正在使用SIGRTMIN信号。
所以问题是为什么create_timer()给出EAGAIN错误?
我们非常感谢您的帮助。 谢谢
我使用下面的代码。
void GetAndPrintPendingSignal()
{
sigset_t waiting_mask;
int signalcount = 0 ;
//sigemptyset (&base_mask);
//sigaddset (&base_mask, SIGINT);
//sigaddset (&base_mask, SIGTSTP);
///* Block user interrupts while doing other processing. */
//sigprocmask (SIG_SETMASK, &base_mask, NULL);
/* After a while, check to see whether any signals are pending. */
sigpending (&waiting_mask);
printf("Singal Pending No :: %d\n",sigpending(&waiting_mask));
// printf("Singal Pending YES/NO :: %d\n",sigismember(&waiting_mask, SIGRTMIN));
while(1)
{
sigemptyset(&waiting_mask);
sigpending(&waiting_mask);
if(1 == sigismember(&waiting_mask, SIGRTMIN))
{
/* User has tried to kill the process. */
printf("Singal Pending No :: %d\n",signalcount++);
}
else
{
break;
}
}
}