書式
Linux のシステムコール。説明
システムコールは、アプリケーションと Linux カーネルとの間の 基本的なインタフェースである。システムコールとライブラリのラッパー関数
システムコールは一般には直接起動されず、 glibc (や他の何らかのライブラリ) 経由で起動される。 システムコールの直接起動については、詳細は intro(2) を参照のこと。 いつもという訳ではないが、普通は、ラッパー関数の名前はその関数が起動する システムコールの名前と同じである。 例えば、glibc には truncate() という関数があり、この関数は "truncate" システムコールを起動する。たいていの場合、glibc のラッパー関数はかなり簡単なもので、 システムコールを起動する前に引き数を適切なレジスタにコピーし、 システムコールが返った後は errno を適切に設定する以外は、ほとんど処理を行わない (これらは、ラッパー関数が提供されていない場合に システムコールを起動するのに使用する syscall(2) により実行される処理と同じである)。 [注意] システムコールは失敗を示すのに負のエラー番号を呼び出し元に返す。 失敗が起こった際には、ラッパー関数は返されたエラー番号を反転して (正の値に変換し)、それを errno にコピーし、ラッパー関数の呼び出し元に -1 を返す。
しかしながら、時には、ラッパー関数がシステムコールを起動する前に 何らかの追加の処理を行う場合がある。 例えば、現在、 二つの関連するシステムコール truncate(2) と truncate64(2) があり、glibc のラッパー関数 truncate() は、カーネルがこれらのシステムコールのうちどちらを提供しているかをチェックし、 どちらを採用するかを決定する。
システムコールのリスト
以下は Linux のシステムコールのリストである。 このリストで、 Kernel の列は、Linux 2.2 以降で登場したシステムコールが 登場したカーネルバージョンを示す。 以下に詳細な説明を記す。- *
- カーネルバージョンがない場合、そのシステムコールは カーネル 1.0 もしくはそれ以前に登場した。
- *
- システムコールに "1.2" と書かれている場合、 そのシステムコールがおそらくバージョン 1.1.x のカーネルで登場し、 安定版のカーネルでは 1.2 で初めて登場したことを意味する。 (バージョン 1.2 のカーネルは、カーネル 1.0.6 から分岐し、 バージョン 1.1.x の不安定版のカーネル系列として開発された。)
- *
- システムコールに "2.0" と書かれている場合、 そのシステムコールがおそらくバージョン 1.3.x のカーネルで登場し、 安定版のカーネルでは 2.0 で初めて登場したことを意味する。 (バージョン 2.0 のカーネルは、バージョン 1.2.10 あたりのカーネル 1.2.x から分岐し、バージョン 1.3.x の不安定版のカーネル系列として開発された。)
- *
- システムコールに "2.2" と書かれている場合、 そのシステムコールがおそらくバージョン 2.1.x のカーネルで登場し、 安定版のカーネルでは 2.2.0 で初めて登場したことを意味する。 (バージョン 2.2 のカーネルは、カーネル 2.0.21 から分岐し、 バージョン 2.1.x の不安定版のカーネル系列として開発された。)
- *
- システムコールに "2.4" と書かれている場合、 そのシステムコールがおそらくバージョン 2.3.x のカーネルで登場し、 安定版のカーネルでは 2.4.0 で初めて登場したことを意味する。 (バージョン 2.4 のカーネルは、カーネル 2.2.8 から分岐し、 バージョン 2.3.x の不安定版のカーネル系列として開発された。)
- *
- システムコールに "2.6" と書かれている場合、 そのシステムコールがおそらくバージョン 2.5.x のカーネルで登場し、 安定版のカーネルでは 2.6.0 で初めて登場したことを意味する。 (バージョン 2.6 のカーネルは、カーネル 2.4.15 から分岐し、 バージョン 2.5.x の不安定版のカーネル系列として開発された。)
- *
- カーネル 2.6.0 から開発モデルは変更され、新しいシステムコールが 個々の 2.6.x のリリースでも登場するようになった。 その場合、このリストでは、システムコールが登場した 厳密なバージョン番号が記載されている。この慣習は、カーネル 2.6.39 の 後継となるバージョン 3.x 系列のカーネルでも継続されている。
- *
- 前の安定版カーネル系列から分岐した後に安定版カーネル系列にシステムコール が追加された場合、以前の安定版カーネル系列にそのシステムコールが 移植 (backport) されることがある。 例えば、2.6.x で登場したシステムコールのいくつかは、 2.4.15 以降の 2.4.x リリースにも backport された。 この場合、システムコールが登場したバージョンとして、 両方の安定版系列のバージョンが記載されている。
カーネル 3.14 で利用可能なシステムコールのリストを以下に示す (それ以前のカーネルでだけ利用可能なものも少数だが含まれる):
| System call | Kernel | Notes |
| _llseek(2) | 1.2 | |
| _newselect(2) | 2.0 | |
| _sysctl(2) | 2.0 | |
| accept(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| accept4(2) | 2.6.28 | |
| access(2) | 1.0 | |
| acct(2) | 1.0 | |
| add_key(2) | 2.6.11 | |
| adjtimex(2) | 1.0 | |
| alarm(2) | 1.0 | |
| alloc_hugepages(2) | 2.5.36 | 2.5.44 で削除 |
| bdflush(2) | 1.2 |
2.6 以降では非推奨
(何もしない) |
| bind(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| brk(2) | 1.0 | |
| cacheflush(2) | 1.2 | x86 にはない |
| capget(2) | 2.2 | |
| capset(2) | 2.2 | |
| chdir(2) | 1.0 | |
| chmod(2) | 1.0 | |
| chown(2) | 2.2 |
バージョン毎の詳細は
chown(2) を参照。 |
| chown32(2) | 2.4 | |
| chroot(2) | 1.0 | |
| clock_adjtime(2) | 2.6.39 | |
| clock_getres(2) | 2.6 | |
| clock_gettime(2) | 2.6 | |
| clock_nanosleep(2) | 2.6 | |
| clock_settime(2) | 2.6 | |
| clone(2) | 1.0 | |
| close(2) | 1.0 | |
| connect(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| creat(2) | 1.0 | |
| create_module(2) | 2.6 で削除 | |
| delete_module(2) | 1.0 | |
| dup(2) | 1.0 | |
| dup2(2) | 1.0 | |
| dup3(2) | 2.6.27 | |
| epoll_create(2) | 2.6 | |
| epoll_create1(2) | 2.6.27 | |
| epoll_ctl(2) | 2.6 | |
| epoll_pwait(2) | 2.6.19 | |
| epoll_wait(2) | 2.6 | |
| eventfd(2) | 2.6.22 | |
| eventfd2(2) | 2.6.27 | |
| execve(2) | 1.0 | |
| exit(2) | 1.0 | |
| exit_group(2) | 2.6 | |
| faccessat(2) | 2.6.16 | |
| fadvise64(2) | 2.6 | |
| fadvise64_64(2) | 2.6 | |
| fallocate(2) | 2.6.23 | |
| fanotify_init(2) | 2.6.37 | |
| fanotify_mark(2) | 2.6.37 | |
| fchdir(2) | 1.0 | |
| fchmod(2) | 1.0 | |
| fchmodat(2) | 2.6.16 | |
| fchown(2) | 1.0 | |
| fchown32(2) | 2.4 | |
| fchownat(2) | 2.6.16 | |
| fcntl(2) | 1.0 | |
| fcntl64(2) | 2.4 | |
| fdatasync(2) | 2.0 | |
| fgetxattr(2) | 2.6; 2.4.18 | |
| finit_module(2) | 3.8 | |
| flistxattr(2) | 2.6; 2.4.18 | |
| flock(2) | 2.0 | |
| fork(2) | 1.0 | |
| free_hugepages(2) | 2.5.36 | 2.5.44 で削除 |
| fremovexattr(2) | 2.6; 2.4.18 | |
| fsetxattr(2) | 2.6; 2.4.18 | |
| fstat(2) | 1.0 | |
| fstat64(2) | 2.4 | |
| fstatat64(2) | 2.6.16 | |
| fstatfs(2) | 1.0 | |
| fstatfs64(2) | 2.6 | |
| fsync(2) | 1.0 | 1.0 |
| ftruncate(2) | 1.0 | |
| ftruncate64(2) | 2.4 | |
| futex(2) | 2.6 | |
| futimesat(2) | 2.6.16 | |
| get_kernel_syms(2) | 2.6 で削除 | |
| get_mempolicy(2) | 2.6.6 | |
| get_robust_list(2) | 2.6.17 | |
| get_thread_area(2) | 2.6 | |
| getcpu(2) | 2.6.19 | |
| getcwd(2) | 2.2 | |
| getdents(2) | 2.0 | |
| getdents64(2) | 2.4 | |
| getegid(2) | 1.0 | |
| getegid32(2) | 2.4 | |
| geteuid(2) | 1.0 | |
| geteuid32(2) | 2.4 | |
| getgid(2) | 1.0 | |
| getgid32(2) | 2.4 | |
| getgroups(2) | 1.0 | |
| getgroups32(2) | 2.4 | |
| getitimer(2) | 1.0 | |
| getpeername(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| getpagesize(2) | 2.0 | x86 にはない |
| getpgid(2) | 1.0 | |
| getpgrp(2) | 1.0 | |
| getpid(2) | 1.0 | |
| getppid(2) | 1.0 | |
| getpriority(2) | 1.0 | |
| getresgid(2) | 2.2 | |
| getresgid32(2) | 2.4 | |
| getresuid(2) | 2.2 | |
| getresuid32(2) | 2.4 | |
| getrlimit(2) | 1.0 | |
| getrusage(2) | 1.0 | |
| getsid(2) | 2.0 | |
| getsockname(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| getsockopt(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| gettid(2) | 2.4.11 | |
| gettimeofday(2) | 1.0 | |
| getuid(2) | 1.0 | |
| getuid32(2) | 2.4 | |
| getxattr(2) | 2.6; 2.4.18 | |
| init_module(2) | 1.0 | |
| inotify_add_watch(2) | 2.6.13 | |
| inotify_init(2) | 2.6.13 | |
| inotify_init1(2) | 2.6.27 | |
| inotify_rm_watch(2) | 2.6.13 | |
| io_cancel(2) | 2.6 | |
| io_destroy(2) | 2.6 | |
| io_getevents(2) | 2.6 | |
| io_setup(2) | 2.6 | |
| io_submit(2) | 2.6 | |
| ioctl(2) | 1.0 | |
| ioperm(2) | 1.0 | |
| iopl(2) | 1.0 | |
| ioprio_get(2) | 2.6.13 | |
| ioprio_set(2) | 2.6.13 | |
| ipc(2) | 1.0 | |
| kcmp(2) | 3.5 | |
| kern_features(2) | 3.7 | Sparc64 |
| kexec_load(2) | 2.6.13 | |
| keyctl(2) | 2.6.11 | |
| kill(2) | 1.0 | |
| lchown(2) | 1.0 |
バージョン毎の詳細は
chown(2) を参照。 |
| lchown32(2) | 2.4 | |
| lgetxattr(2) | 2.6; 2.4.18 | |
| link(2) | 1.0 | |
| linkat(2) | 2.6.16 | |
| listen(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| listxattr(2) | 2.6; 2.4.18 | |
| llistxattr(2) | 2.6; 2.4.18 | |
| lookup_dcookie(2) | 2.6 | |
| lremovexattr(2) | 2.6; 2.4.18 | |
| lseek(2) | 1.0 | |
| lsetxattr(2) | 2.6; 2.4.18 | |
| lstat(2) | 1.0 | |
| lstat64(2) | 2.4 | |
| madvise(2) | 2.4 | |
| mbind(2) | 2.6.6 | |
| migrate_pages(2) | 2.6.16 | |
| mincore(2) | 2.4 | |
| mkdir(2) | 1.0 | |
| mkdirat(2) | 2.6.16 | |
| mknod(2) | 1.0 | |
| mknodat(2) | 2.6.16 | |
| mlock(2) | 2.0 | |
| mlockall(2) | 2.0 | |
| mmap(2) | 1.0 | |
| mmap2(2) | 2.4 | |
| modify_ldt(2) | 1.0 | |
| mount(2) | 1.0 | |
| move_pages(2) | 2.6.18 | |
| mprotect(2) | 1.0 | |
| mq_getsetattr(2) | 2.6.6 | |
| mq_notify(2) | 2.6.6 | |
| mq_open(2) | 2.6.6 | |
| mq_timedreceive(2) | 2.6.6 | |
| mq_timedsend(2) | 2.6.6 | |
| mq_unlink(2) | 2.6.6 | |
| mremap(2) | 2.0 | |
| msgctl(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| msgget(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| msgrcv(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| msgsnd(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| msync(2) | 2.0 | |
| munlock(2) | 2.0 | |
| munlockall(2) | 2.0 | |
| munmap(2) | 1.0 | |
| name_to_handle_at(2) | 2.6.39 | |
| nanosleep(2) | 2.0 | |
| nfsservctl(2) | 2.2 | 3.1 で削除 |
| nice(2) | 1.0 | |
| oldfstat(2) | 1.0 | |
| oldlstat(2) | 1.0 | |
| oldolduname(2) | 1.0 | |
| oldstat(2) | 1.0 | |
| olduname(2) | 1.0 | |
| open(2) | 1.0 | |
| open_by_handle_at(2) | 2.6.39 | |
| openat(2) | 2.6.16 | |
| pause(2) | 1.0 | |
| pciconfig_iobase(2) | 2.2.15; 2.4 | x86 にはない |
| pciconfig_read(2) | 2.0.26; 2.2 | x86 にはない |
| pciconfig_write(2) | 2.0.26; 2.2 | x86 にはない |
| perf_event_open(2) | 2.6.31 |
2.6.31 では perf_counter_open() という
名前であった; 2.6.32 で名称変更 |
| personality(2) | 1.2 | |
| perfctr(2) | 2.2 | Sparc; 2.6.34 で削除 |
| perfmonctl(2) | 2.4 | ia64 |
| pipe(2) | 1.0 | |
| pipe2(2) | 2.6.27 | |
| pivot_root(2) | 2.4 | |
| poll(2) | 2.0.36; 2.2 | |
| ppc_rtas(2) | PowerPC のみ | |
| ppoll(2) | 2.6.16 | |
| prctl(2) | 2.2 | |
| pread64(2) |
2.2 で "pread" として追加;
2.6 で "pread64" に名称変更 | |
| preadv(2) | 2.6.30 | |
| prlimit(2) | 2.6.36 | |
| process_vm_readv(2) | 3.2 | |
| process_vm_writev(2) | 3.2 | |
| pselect6(2) | 2.6.16 | |
| ptrace(2) | 1.0 | |
| pwrite64(2) |
2.2 で "pwrite" として追加;
2.6 で "pwrite64" に名称変更 | |
| pwritev(2) | 2.6.30 | |
| query_module(2) | 2.2 | 2.6 で削除 |
| quotactl(2) | 1.0 | |
| read(2) | 1.0 | |
| readahead(2) | 2.4.13 | |
| readdir(2) | 1.0 | |
| readlink(2) | 1.0 | |
| readlinkat(2) | 2.6.16 | |
| readv(2) | 2.0 | |
| reboot(2) | 1.0 | |
| recv(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| recvfrom(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| recvmsg(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| recvmmsg(2) | 2.6.33 | |
| remap_file_pages(2) | 2.6 | |
| removexattr(2) | 2.6; 2.4.18 | |
| rename(2) | 1.0 | |
| renameat(2) | 2.6.16 | |
| request_key(2) | 2.6.11 | |
| restart_syscall(2) | 2.6 | |
| rmdir(2) | 1.0 | |
| rt_sigaction(2) | 2.2 | |
| rt_sigpending(2) | 2.2 | |
| rt_sigprocmask(2) | 2.2 | |
| rt_sigqueueinfo(2) | 2.2 | |
| rt_sigreturn(2) | 2.2 | |
| rt_sigsuspend(2) | 2.2 | |
| rt_sigtimedwait(2) | 2.2 | |
| rt_tgsigqueueinfo(2) | 2.6.31 | |
| s390_runtime_instr(2) | 3.7 | s390 のみ |
| sched_get_priority_max(2) | 2.0 | |
| sched_get_priority_min(2) | 2.0 | |
| sched_getaffinity(2) | 2.6 | |
| sched_getattr(2) | 3.14 | |
| sched_getparam(2) | 2.0 | |
| sched_getscheduler(2) | 2.0 | |
| sched_rr_get_interval(2) | 2.0 | |
| sched_setaffinity(2) | 2.6 | |
| sched_setattr(2) | 3.14 | |
| sched_setparam(2) | 2.0 | |
| sched_setscheduler(2) | 2.0 | |
| sched_yield(2) | 2.0 | |
| select(2) | 1.0 | |
| semctl(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| semget(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| semop(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| semtimedop(2) | 2.6; 2.4.22 | |
| send(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| sendfile(2) | 2.2 | |
| sendfile64(2) | 2.6; 2.4.19 | |
| sendmmsg(2) | 3.0 | |
| sendmsg(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| sendto(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| set_mempolicy(2) | 2.6.6 | |
| set_robust_list(2) | 2.6.17 | |
| set_thread_area(2) | 2.6 | |
| set_tid_address(2) | 2.6 | |
| setdomainname(2) | 1.0 | |
| setfsgid(2) | 1.2 | |
| setfsgid32(2) | 2.4 | |
| setfsuid(2) | 1.2 | |
| setfsuid32(2) | 2.4 | |
| setgid(2) | 1.0 | |
| setgid32(2) | 2.4 | |
| setgroups(2) | 1.0 | |
| setgroups32(2) | 2.4 | |
| sethostname(2) | 1.0 | |
| setitimer(2) | 1.0 | |
| setns(2) | 3.0 | |
| setpgid(2) | 1.0 | |
| setpriority(2) | 1.0 | |
| setregid(2) | 1.0 | |
| setregid32(2) | 2.4 | |
| setresgid(2) | 2.2 | |
| setresgid32(2) | 2.4 | |
| setresuid(2) | 2.2 | |
| setresuid32(2) | 2.4 | |
| setreuid(2) | 1.0 | |
| setreuid32(2) | 2.4 | |
| setrlimit(2) | 1.0 | |
| setsid(2) | 1.0 | |
| setsockopt(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| settimeofday(2) | 1.0 | |
| setuid(2) | 1.0 | |
| setuid32(2) | 2.4 | |
| setup(2) | 2.2 で削除 | |
| setxattr(2) | 2.6; 2.4.18 | |
| sgetmask(2) | 1.0 | |
| shmat(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| shmctl(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| shmdt(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| shmget(2) | 2.0 | ipc(2) の「注意」の節を参照 |
| shutdown(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| sigaction(2) | 1.0 | |
| sigaltstack(2) | 2.2 | |
| signal(2) | 1.0 | |
| signalfd(2) | 2.6.22 | |
| signalfd4(2) | 2.6.27 | |
| sigpending(2) | 1.0 | |
| sigprocmask(2) | 1.0 | |
| sigreturn(2) | 1.0 | |
| sigsuspend(2) | 1.0 | |
| socket(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| socketcall(2) | 1.0 | |
| socketpair(2) | 2.0 | socketcall(2) の「注意」の節を参照 |
| splice(2) | 2.6.17 | |
| spu_create(2) | 2.6.16 | PowerPC のみ |
| spu_run(2) | 2.6.16 | PowerPC のみ |
| ssetmask(2) | 1.0 | |
| stat(2) | 1.0 | |
| stat64(2) | 2.4 | |
| statfs(2) | 1.0 | |
| statfs64(2) | 2.6 | |
| stime(2) | 1.0 | |
| subpage_prot(2) | 2.6.25 | PowerPC で |
| CONFIG_PPC_64K_PAGES の場合 | ||
| swapoff(2) | 1.0 | |
| swapon(2) | 1.0 | |
| symlink(2) | 1.0 | |
| symlinkat(2) | 2.6.16 | |
| sync(2) | 1.0 | |
| sync_file_range(2) | 2.6.17 | |
| sync_file_range2(2) | 2.6.22 |
アーキテクチャ固有の
sync_file_range(2) の一種
|
| syncfs(2) | 2.6.39 | |
| sysfs(2) | 1.2 | |
| sysinfo(2) | 1.0 | |
| syslog(2) | 1.0 | |
| tee(2) | 2.6.17 | |
| tgkill(2) | 2.6 | |
| time(2) | 1.0 | |
| timer_create(2) | 2.6 | |
| timer_delete(2) | 2.6 | |
| timer_getoverrun(2) | 2.6 | |
| timer_gettime(2) | 2.6 | |
| timer_settime(2) | 2.6 | |
| timerfd_create(2) | 2.6.25 | |
| timerfd_gettime(2) | 2.6.25 | |
| timerfd_settime(2) | 2.6.25 | |
| times(2) | 1.0 | |
| tkill(2) | 2.6; 2.4.22 | |
| truncate(2) | 1.0 | |
| truncate64(2) | 2.4 | |
| ugetrlimit(2) | 2.4 | |
| umask(2) | 1.0 | |
| umount(2) | 1.0 | |
| umount2(2) | 2.2 | |
| uname(2) | 1.0 | |
| unlink(2) | 1.0 | |
| unlinkat(2) | 2.6.16 | |
| unshare(2) | 2.6.16 | |
| uselib(2) | 1.0 | |
| ustat(2) | 1.0 | |
| utime(2) | 1.0 | |
| utimensat(2) | 2.6.22 | |
| utimes(2) | 2.2 | |
| utrap_install(2) | 2.2 | Sparc |
| vfork(2) | 2.2 | |
| vhangup(2) | 1.0 | |
| vm86old(2) | 1.0 |
以前は "vm86";
2.0.28/2.2 で改名された
|
| vm86(2) | 2.0.28; 2.2 | |
| vmsplice(2) | 2.6.17 | |
| wait4(2) | 1.0 | |
| waitid(2) | 2.6.10 | |
| waitpid(2) | 1.0 | |
| write(2) | 1.0 | |
| writev(2) | 2.0 |
x86-32 を含む多くのプラットフォームでは、ソケット関連のシステムコールは (glibc のラッパー関数を介してだが) すべて socketcall(2) 経由に多重されている。 同様に、System V IPC 関連のシステムコールは ipc(2) 経由に多重されている。
以下のシステムコールは、システムコールテーブルにスロットが予約されているが、 標準のカーネルには実装されていない: afs_syscall(2), break(2), ftime(2), getpmsg(2), gtty(2), idle(2), lock(2), madvise1(2), mpx(2), phys(2), prof(2), profil(2), putpmsg(2), security(2), stty(2), tuxcall(2), ulimit(2), vserver(2) (unimplemented(2) も参照)。 しかし、ftime(3), profil(3), ulimit(3) はライブラリルーチンとして 実装されている。 phys(2) 用の場所は 2.1.116 以降では umount(2) 用に 使用されている; 将来においても phys(2) は実装されない。 getpmsg(2) と putpmsg(2) は STREAMS 対応のパッチが適用された カーネル用であり、標準のカーネルに登場することはないかもしれない。
set_zone_reclaim(2) は少しの間だけ存在した。 Linux 2.6.13 で追加され、2.6.16 で削除された。このシステムコールがユーザ空間から使える状態になったことはない。
注意
たいていは、 /usr/include/asm/unistd.h で定義されている番号 __NR_xxx のシステムコールのコードは、 Linux カーネルソースの sys_xxx() というルーチンに書かれている (i386 における実行テーブルは /usr/src/linux/arch/i386/kernel/entry.S に書かれている)。 しかしこれには多くの例外がある。古いシステムコールは新版に置き換えられて きたが、この置き換えはあまり体系立てて行われて来なかったからである。 parisc, sparc, sparc64, alpha といったプロプリエタリなオペレーティングシステムのエミュレーション機能があるプラットフォームでは、多くの追加システムコールがある。 mips64 には、32 ビットシステムコールのフルセットも含まれている。
時間の経過とともに、いくつかのシステムコールではインタフェースの 変更が必要になってきた。 こうした変更の理由の一つは、システムコールに渡される構造体やスカラー値 のサイズを増やす必要があることだった。 これらの変更の結果、現在では、同様の処理を実行するが 引き数のサイズなどの詳細は異なる、一連のシステムコール群が いくつか存在する (例えば、 truncate(2) と truncate64(2))。 (すでに述べたように、 一般にはアプリケーションがこのことを意識することはない。 glibc のラッパー関数が、適切なシステムコールを起動し、古いバイナリに 対して ABI レベルでの互換性を保持することを保証する処理を行っている。) 複数のバージョンが存在するシステムコールの例を以下に挙げる。
- *
- これまでに、 stat(2) には 3 種類の異なるバージョンが存在する。 sys_stat() (スロットは __NR_oldstat)、 sys_newstat() (スロットは __NR_stat)、 sys_stat64() (カーネル 2.4 で導入; スロットは __NR_stat64)。 3つのうち最後のものが最新である。 lstat(2) と fstat(2) についても同様である。
- *
- また、 __NR_oldolduname, __NR_olduname, __NR_uname という定義は、それぞれ sys_olduname(), sys_uname(), sys_newuname() というルーチンを参照している。
- *
- Linux 2.0 では、 vm86(2) の新バージョンが登場した。カーネルルーチンの 古いバージョン、新しいバージョンはそれぞれ sys_vm86old(), sys_vm86() という名前である。
- *
- Linux 2.4 では、 getrlimit(2) の新バージョンが登場した。カーネルルーチンの 古いバージョン、新しいバージョンはそれぞれ sys_old_getrlimit() (スロットは __NR_getrlimit), sys_getrlimit() (スロットは __NR_ugetrlimit) という名前である。
- *
- Linux 2.4 で、ユーザ ID とグループ ID のサイズが 16 ビットから 32 ビットに増えた。 この変更に対応するため、いくつかのシステムコールが追加された (chown32(2), getuid32(2), getgroups32(2), setresuid32(2) など)。 これらのシステムコールが、末尾の "32" が付かない同名の 古いバージョンに代わって使われるようになった。
- *
-
Linux 2.4 では、32 ビットアーキテクチャ上のアプリケーションが 大きなファイル (つまり、32 ビットでは表現できないサイズや
ファイルオフセットが必要なファイル) にアクセスできるようになった。 この変更に対応するため、ファイルオフセットとサイズを扱う
システムコールの置き換えが必要となった。その結果、 fcntl64(2), ftruncate64(2),
getdents64(2), stat64(2), statfs64(2)
と、ファイルディスクリプタやシンボリックリンクで同じ機能を持つ システムコールが追加された。 これらのシステムコールが、末尾の "64"
が付かない同名の 古いバージョンに代わって使われるようになった。 但し、"stat" 系のシステムコールはその限りではない。
64-bit ファイルアクセスと 32-bit UID のみを持つ 新しいプラットフォーム (alpha, ia64, s390x など) では、 *64 や *32 という名前のシステムコールはない。 *64 や *32 というシステムコールが存在する場合、 *64 や *32 がついていないシステムコールは廃止扱いである。
- *
- リアルタイムシグナル (signal(7) 参照) への対応を追加するために、 rt_sig* 系のシステムコールがカーネル 2.2 で追加された。 これらのシステムコールが、先頭に "rt_" が付かない同名の 古いバージョンに代わって使われるようになった。
- *
- select(2) と mmap(2) は 5つもしくはそれ以上の引き数を使用しており、 i386 では引き数の受け渡しに問題が生じる。 そのため、他のアーキテクチャでは __NR_select と __NR_mmap に対応する sys_select() と sys_mmap() が存在するが、i386 では代わりに old_select() と old_mmap() というルーチンがある (これらのルーチンは引き数ブロックへのポインタを使用する)。 現在では 5つの引き数を渡すことはもはや問題ではなくなっており、 __NR__newselect は sys_select() に直接対応するようになっている。 __NR_mmap2 についても同様である。
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

