ドコモの仕事と並行して、自分の研究となる予定のものも暇を見つけて進めています。
今日はERESTARTSYSの話です。普通ユーザーモードではお目にかかりません。しかしプロセスがトレースされていて、システムコールによりブロックされているという特殊状態でシグナルを受け取ると、返り値にこのエラーが入ったシステムコールがトラップされます。
getchar(3) でブロックするハンドラを書いて、sigaction(2) で指定するプログラムをトレーサで見張り、別のシェルからそのプログラムにkill(1) でシグナルを投げました。トレースするとこんな感じでした。
とこんな具合になっているようです。トレースされている方のプロセスではreadは失敗に終わり、トレースしないときと同様にEINTRが設定されて帰ってきます。ちなみにシグナルハンドラでブロックしているときに、さらにシグナルを投げるとハンドラの入れ子になります。1 -> 2 -> 2 sigreturn -> 1 sigreturn -> 元の場所、となります。
sigreturnの帰ってこないという特殊性とERESTARTSYSを考慮しないと、システムコールのスタックがうまく作れないなーなんて思った昼すぎのひととき。
< | 2005 | > | ||||
<< | < | 12 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)