2017-10-09 15 views
0

コードはこのようです。状況によってはeagainが返されます。TIME_CREATEは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. 

第1の状況、私たちのマシンでは、ulimit -iは2061776で、それがこの制限に達することができません。

第2の状況とそれを見つける方法でタイマー制限は何ですか?

+0

[timer_create'のマニュアルページ](http://man7.org/linux/man-pages/man2/timer_create.2.html)には、実際には "タイマー構造のカーネル割り当て時の一時エラー"と書かれています。多分あなたはあなたの議論を再試行したりチェックしたりする必要があります。 '_steady_clock_timer'はここには表示されておらず、正しく初期化されていないかもしれません。 – tadman

+0

'_steady_clock_timer'は' timer_t _steady_clock_timer = {} 'として定義されています –

+0

すべての内部プロパティを初期化するのに十分ですか? – tadman

答えて

0

は、次のように変更し作ってみましょう:

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

タイマーの割り当てを壊す何かに初期化されるsigeventの側面があることも可能です。

1

ここではEAGAINケースを処理する必要があります。

timer_create()の実装では、システムコール処理中に2つの割り当てが行われます。 a)タイマー割り振りまたはb)シグギング割り振り失敗の場合に起こりうる。

もう1つのことは、実行中のタスクのサイズがsigpendingであることです。実行中のタスクRLIMIT_SIGPENDINGman setrlimit)を増やすことができます。 ulimitで変更すると、シェルとそれによって開始されるプロセスにのみ影響します。したがって、アプリケーションに直接影響することはありません。

+0

私はいくつかのログを追加しようとし、eagainが現れたときに再試行します –

関連する問題