代码是这样的。在某些情况下,会返回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);
在man中,有两种情况返回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,达不到这个限制。
第二种情况说的timer limit是什么,怎么找?
你必须在这里处理 EAGAIN
的情况。
timer_create()
的实现在系统调用处理期间进行了两次分配。如果 a) 定时器分配或 b) 信号队列分配失败,则可能会发生这种情况。
要查看的另一件事是找到正在运行的任务的 sigpending
大小。可以增加运行任务的 RLIMIT_SIGPENDING
(man setrlimit
)。使用 ulimit
进行更改只会影响 shell 和由它启动的进程,因此它可能不会直接影响您的应用程序。
我是一名优秀的程序员,十分优秀!