また、シグナルを受信した際、プロセスは、エラー終了するかシステムコールをもう一度行うように指定できます。 これは、処理がユーザ空間に戻る際に、実行ポインタを「カーネルへ処理を移す命令」に戻すことによって実現されています。 ちょうど書くネタに困っていたこともあり(!)、今のLinux実装を調べてまとめました。 なお、調査対象およびコードを引用したLinuxのバージョンは4.18.11です。また、アーキテクチャはx86です。 システムコールから戻る箇所 システムコールを実行するメインとなる処理は以下の関数です。 #ifdef CONFIG_X86_64 __visible void do_syscall_64(unsigned long nr, struct pt_regs *regs) { struct thread_info *ti; enter_from_user_mode(); loc
![Linuxのシステムコール再実行について - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/93992a5574ba3a09d352d84e78055d7e132ac14e/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TGludXglRTMlODElQUUlRTMlODIlQjclRTMlODIlQjklRTMlODMlODYlRTMlODMlQTAlRTMlODIlQjMlRTMlODMlQkMlRTMlODMlQUIlRTUlODYlOEQlRTUlQUUlOUYlRTglQTElOEMlRTMlODElQUIlRTMlODElQTQlRTMlODElODQlRTMlODElQTYmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTQ4ODY3Yzc1M2Y1N2M3MTNmNDhmZTBjMWE2MzFlNDJk%26mark-x%3D120%26mark-y%3D96%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBha2FjaG9jaGluJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz02NDFhZmNiZTRiZGVmMmI1YzJmNTI5ZTc4NzEwYTExYg%26blend-x%3D120%26blend-y%3D500%26blend-mode%3Dnormal%26s%3D610dd70bc6838a0050b2624ef34cc696)