Don’t Mix alarm with sleep

システムコールの alarm(2) は指定した秒数後に SIGALRM シグナルを送る。alarm を複数回よんでも複数のアラームは設定出来ない。古いアラームは解除され、新しいアラームが再設定される。POSIX 規格の alarm(IEEE Std 1003.1, 2004 Edition)でも以下の様に明記されている。

Alarm requests are not stacked; only one SIGALRM generation can be scheduled in this manner. If the SIGALRM signal has not yet been generated, the call shall result in rescheduling the time at which the SIGALRM signal is generated.

ここで気を付けなければいけないのは、alarm(2) を使って sleep(3) が実装されているシステムもあるということ。このようなシステムでは SIGALRMalarm によるものなのか sleep によるものなのか区別がつかない。
同じ POSIX 規格の sleep の RATIONALE(IEEE Std 1003.1, 2004 Edition)では以下の様に記載されている。

There are two general approaches to the implementation of the sleep() function. One is to use the alarm() function to schedule a SIGALRM signal and then suspend the calling thread waiting for that signal. The other is to implement an independent facility. This volume of IEEE Std 1003.1-2001 permits either approach.

Linux の sleep(3) の MAN でも BUGS の1つ目に記述がある。

sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.

SIGALARM で実装されていたのは大昔の話で現代は関係ないよね、と思いつつググってみると「 Solaris 9 では sleep が alarm で 実装されている」という書き込みを StackOverflow で見つける。

SIGALRM while sleeping on Solaris 9

さらにググると、Sun Developer Network(SDN) の “Porting UNIX Applications to the Solaris Operating Environment” に正式な(?)記述を見かける。

sleep Generates Alarm Signals Under the Solaris Operating Environment
The sleep() function under the Solaris Operating Environment is implemented by setting an alarm signal (SIGALRM). Other UNIX systems do not necessarily operate in the same way.

というわけで仕事で触る可能性のある環境でも alarm で実装された sleep に出くわす可能性があることは分かった。
手元の Linux では大丈夫だったが、脳の片隅にしまっておこう。

Tagged with: , , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: