TIME_CREATE返回EAGAIN,但资源充足

时间:2017-10-09 02:06:09

标签: c linux

代码是这样的。在某些情况下,返回了eagain。

struct sigevent sev;
sev.sigev_notify = SIGEV_THREAD_ID;
sev._sigev_un._tid = syscall(SYS_gettid);
sev.sigev_signo = alarm_signal();
r = timer_create(CLOCK_MONOTONIC, &sev, &_steady_clock_timer);
assert(r >= 0);

在男人中,EGAIN会在两种情况下返回,

EAGAIN
The system lacks sufficient signal queuing resources to honor the request.
EAGAIN
The calling process has already created all of the timers it is allowed by 
this implementation.
第一种情况,在我们的机器中,ulimit -i是2061776,它不能达到这个限制。

第二种情况所说的计时器限制是多少以及如何找到它?

2 个答案:

答案 0 :(得分:1)

您必须在此处理EAGAIN案例。

timer_create()的实现在系统调用处理期间进行了两次分配。如果a)定时器分配或b)sigqueue分配失败,则可能发生这种情况。

要看的另一件事是找到正在运行的任务的sigpending大小。可以增加正在运行的任务RLIMIT_SIGPENDINGman setrlimit)。使用ulimit进行更改只会影响shell及其启动的进程,因此它可能对您的应用程序没有直接影响。

答案 1 :(得分:0)

尝试进行以下更改:

struct sigevent sev;
memset(&sev, 0, sizeof(sev));

有可能是sigevent的一个方面被初始化为破坏计时器分配的东西。