As of Linux 2.0.34, there are 164 system calls listed in
/usr/include/asm/unistd.h .
This man page lists them (providing hyperlinks if you read this
with a browser).
_llseek(2),
_newselect(2),
_sysctl(2),
access(2),
acct(2),
adjtimex(2),
afs_syscall,
alarm(2),
bdflush(2),
break,
brk(2),
chdir(2),
chmod(2),
chown(2),
chroot(2),
clone(2),
close(2),
creat(2),
create_module(2),
delete_module(2),
dup(2),
dup2(2),
execve(2),
exit(2),
fchdir(2),
fchmod(2),
fchown(2),
fcntl(2),
fdatasync(2),
flock(2),
fork(2),
fstat(2),
fstatfs(2),
fsync(2),
ftime,
ftruncate(2),
get\%_kernel_syms(2),
get\%dents(2),
get\%egid(2),
get\%euid(2),
get\%gid(2),
get\%groups(2),
get\%itimer(2),
get\%pgid(2),
get\%pgrp(2),
get\%pid(2),
get\%ppid(2),
get\%priority(2),
get\%rlimit(2),
get\%rusage(2),
get\%sid(2),
get\%timeofday(2),
get\%uid(2),
gtty,
idle(2),
init_module(2),
ioctl(2),
io\%perm(2),
iopl(2),
ipc(2),
kill(2),
link(2),
lock,
lseek(2),
lstat(2),
mkdir(2),
mknod(2),
mlock(2),
mlockall(2),
mmap(2),
modify_ldt(2),
mount(2),
mprotect(2),
mpx,
mremap(2),
msync(2),
munlock(2),
munlockall(2),
munmap(2),
nanosleep(2),
nice(2),
oldfstat, oldlstat, oldolduname, oldstat, olduname,
open(2),
pause(2),
personality(2),
phys,
pipe(2),
prof, profil,
ptrace(2),
quotactl(2),
read(2),
readdir(2),
readlink(2),
readv(2),
reboot(2),
rename(2),
rmdir(2),
sched_\%get_\%priority_max(2),
sched_\%get_\%priority_min(2),
sched_\%get\%param(2),
sched_\%get\%scheduler(2),
sched_\%rr_get_interval(2),
sched_\%set\%param(2),
sched_\%set\%scheduler(2),
sched_\%yield(2),
select(2),
set\%domainname(2),
set\%fsgid(2),
set\%fsuid(2),
set\%gid(2),
set\%groups(2),
set\%hostname(2),
set\%itimer(2),
set\%pgid(2),
set\%priority(2),
set\%regid(2),
set\%reuid(2),
set\%rlimit(2),
set\%sid(2),
set\%timeofday(2),
set\%uid(2),
setup(2),
sgetmask(2),
sigaction(2),
signal(2),
sigpending(2),
sigprocmask(2),
sigreturn(2),
sigsuspend(2),
socketcall(2),
ssetmask(2),
stat(2),
statfs(2),
stime(2),
stty,
swapoff(2),
swapon(2),
symlink(2),
sync(2),
sysfs(2),
sysinfo(2),
syslog(2),
time(2),
times(2),
truncate(2),
ulimit,
umask(2),
umount(2),
uname(2),
unlink(2),
uselib(2),
ustat(2),
utime(2),
vhangup(2),
vm86(2),
wait4(2),
waitpid(2),
write(2),
writev(2).
Of the above, 5 are obsolete, namely
oldfstat, oldlstat, oldolduname, oldstat and olduname
(see also obsolete(2)),
and 11 are unimplemented, namely
afs_syscall, break, ftime, gtty, lock, mpx, phys, prof, profil,
stty and ulimit (see also unimplemented(2)).
However, ftime(3), profil(3) and ulimit(3) exist as library routines.
The slot for phys is in use since 2.1.116 for umount2;
phys will never be implemented.
Roughly speaking, the code belonging to the system call
with number __NR_xxx defined in
/usr/include/asm/unistd.h
can be found in the kernel source in the routine
sys_xxx() .
(The dispatch table for i386 can be found in
/usr/src/linux/arch/i386/kernel/entry.S .)
There are many exceptions, however, mostly because
older system calls were superseded by newer ones,
and this has been treated somewhat unsystematically.
Below the details for Linux 2.0.34.
The defines __NR_oldstat and __NR_stat refer to the routines
sys_stat() and sys_newstat(), and similarly for
fstat
and
lstat .
Similarly, the defines __NR_oldolduname, __NR_olduname and
__NR_uname refer to the routines sys_olduname(), sys_uname()
and sys_newuname().
Thus, __NR_stat and __NR_uname have always referred to the latest
version of the system call, and the older ones are for backward
compatibility.
It is different with
select
and
mmap .
These use five or more parameters, and caused problems the way
parameter passing on the i386 used to be set up. Thus, while
other architectures have sys_select() ans sys_mmap() corresponding
to __NR_select and __NR_mmap, on i386 one finds old_select()
and old_mmap() (routines that use a pointer to a
parameter block) instead. These days passing five parameters
is not a problem anymore, and there is a __NR__newselect (used by
libc 6) that corresponds directly to sys_select().
Two other system call numbers, __NR__llseek and __NR__sysctl
have an additional underscore absent in sys_llseek() and sys_sysctl().
Then there is __NR_readdir corresponding to old_readdir(),
which will read at most one directory entry at a time, and is
superseded by sys_getdents().
Finally, the system call 166, with entry point sys_vm86()
does not have a symbolic number at all. This version supersedes
sys_vm86old() with number __NR_vm86.