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 では大丈夫だったが、脳の片隅にしまっておこう。

Advertisements
Tagged with: , , ,
Posted in linux

Leave a Reply

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

WordPress.com Logo

You are commenting using your WordPress.com 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

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: