restart_syscall -
一時停止シグナルによる割り込み後にシステムコールを再開する
long restart_syscall(void);
注:
このシステムコールには、glibc
のラッパー関数はない。「注意」の節を参照。
restart_syscall()
システムコールは、
シグナル (
SIGSTOP や
SIGTSTP
など)
によって停止されたプロセスが
SIGCONT
シグナルを受信して再開された後に、
特定のシステムコールを再開するのに使用される。
このシステムコールはカーネル内部での利用のみを想定している。
restart_syscall() は、
再開時に時刻関連のパラメーターを調整する必要があるシステムコールを再開させる場合にのみ使用される。
概要するシステムコールは
poll(2) (Linux 2.6.24 以降)、
nanosleep(2)
(Linux 2.6 以降)、
clock_nanosleep(2) (Linux 2.6
以降)、
FUTEX_WAIT (Linux 2.6.22 以降)
や
FUTEX_WAIT_BITSET (Linux 2.6.31 以降)
操作を利用した場合の
futex(2) である。
restart_syscall()
は、
中断されたシステムコールを、
経過した時間
(プロセスがシグナルにより停止されていた時間も含む)
を考慮に入れて適切に調整した時刻引数で再開する。
restart_syscall()
の仕組みがないと、
これらのシステムコールの再開で、
プロセスが実行を継続する際にすでに経過した時間を正しく減算できない。
restart_syscall() の返り値は、
再開中のシステムコールの返り値となる。
errno は
restart_syscall()
が再開しているシステムコールのエラーに基づいて設定される。
restart_syscall()
システムコールは Linux 2.6
以降に存在する。
このシステムコールは
Linux 固有である。
このシステムコールには
glibc
のラッパー関数はない。
それはカーネルによる利用だけが想定されており、
アプリケーションは決してこのシステムコールを呼び出すべきではない。
カーネルは
restart_syscall()
を使用することで、
シグナルにより停止されたプロセスが
SIGCONT
により再開された後にシステムコールが再開される際に、
元のシステムコールに指定されたタイムアウト時間の計算に、
プロセスが停止中に経過した時間が含まれることを保証する。
タイムアウト引数を取り、停止シグナルの後に
SIGCONT
があった場合自動的に再開するシステムコールだが、
そのシステムコールに
restart_syscall()
の仕組みが組込まれていない場合には、
プロセスの実行が再開された後、
停止中にプロセスが消費した時間はタイムアウト値としてカウント「されない」。
この問題を持つ有名なシステムコールとしては
ppoll(2),
select(2),
pselect(2)
がある。
ユーザー空間からは
restart_syscall()
の動作はほとんど見えない。
再開されたシステムコールを呼び出したプロセスには、
そのシステムコールが通常通り実行され返ったように見える。
sigaction(2),
sigreturn(2),
signal(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。