注: このシステムコールには、glibc のラッパー関数はない。「注意」の節を参照。
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() を使用することで、 シグナルにより停止されたプロセスが SIGCONT により再開された後にシステムコールが再開される際に、 元のシステムコールに指定されたタイムアウト時間の計算に、 プロセスが停止中に経過した時間が含まれることを保証する。 タイムアウト引数を取り、停止シグナルの後に SIGCONT があった場合自動的に再開するシステムコールだが、 そのシステムコールに restart_syscall() の仕組みが組込まれていない場合には、 プロセスの実行が再開された後、 停止中にプロセスが消費した時間はタイムアウト値としてカウント「されない」。 この問題を持つ有名なシステムコールとしては ppoll(2), select(2), pselect(2) がある。
ユーザー空間からは restart_syscall() の動作はほとんど見えない。 再開されたシステムコールを呼び出したプロセスには、 そのシステムコールが通常通り実行され返ったように見える。
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]