timer_create()错误,如何解决EAGAIN(错误号11)?

时间:2018-08-16 09:00:26

标签: timer linux-kernel posix rhel7 ulimit

我正在将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”检查了文件描述符列表,并且该文件描述符没有太多。

所以我的问题是。

  1. 为什么系统返回错误,即每个计时器都正确设置了Timedout时,最大信号仍处于等待状态?

  2. 在不使ULIMIT_SIGPENDING为无限的情况下该问题的解决方案是什么?

  3. 现在,如果该应用程序中有信号待处理,有什么办法可以通过任何命令或类似的东西看到那些信号?

任何帮助将不胜感激。 谢谢

编辑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;
        }
    }
}

0 个答案:

没有答案