代码是这样的。在某些情况下,返回了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,它不能达到这个限制。
第二种情况所说的计时器限制是多少以及如何找到它?
答案 0 :(得分:1)
您必须在此处理EAGAIN
案例。
timer_create()
的实现在系统调用处理期间进行了两次分配。如果a)定时器分配或b)sigqueue分配失败,则可能发生这种情况。
要看的另一件事是找到正在运行的任务的sigpending
大小。可以增加正在运行的任务RLIMIT_SIGPENDING
(man setrlimit
)。使用ulimit
进行更改只会影响shell及其启动的进程,因此它可能对您的应用程序没有直接影响。
答案 1 :(得分:0)
尝试进行以下更改:
struct sigevent sev;
memset(&sev, 0, sizeof(sev));
有可能是sigevent
的一个方面被初始化为破坏计时器分配的东西。