Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       restart_syscall - 一時停止シグナルによる割り込み後にシステムコールを再開する

書式

       long restart_syscall(void);

       : このシステムコールには、glibc のラッパー関数はない。「注意」の節を参照。

説明

       restart_syscall()  システムコールは、  シグナル  (SIGSTOPSIGTSTP など) によって停止されたプロセスが
       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() の返り値は、 再開中のシステムコールの返り値となる。

エラー

       errnorestart_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/ に書かれている。