NOM
syscalls - Appels système de Linux
SYNOPSIS
Appels système de Linux.
L’appel système est l’interface fondamentale entre une application et
le noyau Linux.
Appels système et fonctions de bibliothèque
Les appels système ne sont en général pas appelé directement, mais à
partir de fonctions de la glibc (ou d’une autre bibliothèque). Pour
avoir des détails pour l’appel direct d’un appel système, consultez
intro(2). Souvent, mais pas toujours, le nom de la fonction de la
bibliothèque est le même que celui de l’appel système à invoquer. Par
exemple, la fonction truncate() de la glibc invoque l’appel système
« truncate » sous-jacent.
Souvent, la fonction enveloppe de la glibc est très petite, ne faisant
que très peu en plus de placer les paramètres dans les bons registres
avant d’appeler l’appel système puis de positionner errno comme il faut
une fois que l’appel système a rendu la main. (Ce sont les mêmes étapes
qui sont effectuées par syscall(2), qui peut être utilisé pour les
appels système pour lesquels il n’y a pas de fonction enveloppe de
fournies.) Note : les appels système indiquent un échec en renvoyant un
numéro d’erreur négatif à l’appelant ; quand ça arrive, la fonction
enveloppe prend l’opposé du numéro d’erreur (pour le rendre positif),
le copie dans errno et renvoie -1 pour l’appelant de la fonction
enveloppe.
Des fois, cependant, la fonction réalise certaines opérations avant
d’invoquer l’appel système. Par exemple, de nos jour il y a deux appels
système truncate(2) et truncate64(2) (pour les raisons données
ci-dessous) et la fonction truncate() de la glibc vérifie quels appels
système sont fournis par le noyau et détermine lequel doit être
utilisé.
Liste des appels système
Cette page de manuel liste ces appels système qui sont communs à la
plupart des plates-formes. Dans cette liste, la colonne Noyau indique
la version du noyau pour laquelle ils sont apparus, s’ils sont apparu
après la version 2.2 de Linux. Notez les points suivants :
* Si aucune version de noyau n’est indiquée, l’appel système est
apparu dans le noyau 1.0 ou auparavant.
* Quand un appel système est marqué « 1.2 », cela signifie que l’appel
système est probablement apparu dans une version 1.1.x du noyau et
est apparu la première fois dans un noyau stable dans la version
1.2. (Le développement du noyau 1.2 a débuté à partir d’une branche
de la version 1.0.6 du noyau, au travers de la série « non stable »
des noyaux 1.1.x.)
* Quand un appel système est marqué « 2.0 », cela signifie que l’appel
système est probablement apparu dans une version 1.3.x du noyau et
est apparu la première fois dans un noyau stable dans la version
2.0. (Le développement du noyau 2.0 a débuté à partir d’une branche
de la version 1.2.x du noyau, vers la version 1.2.10, au travers de
la série « non stable » des noyaux 1.3.x.)
* Quand un appel système est marqué « 2.2 », cela signifie que l’appel
système est probablement apparu dans une version 2.1.x du noyau et
est apparu la première fois dans un noyau stable dans la version
2.2.0. (Le développement du noyau 2.2 a débuté à partir d’une
branche de la version 2.0.21 du noyau, au travers de la série « non
stable » des noyaux 2.1.x.)
* Quand un appel système est marqué « 2.4 », cela signifie que l’appel
système est probablement apparu dans une version 2.3.x du noyau et
est apparu la première fois dans un noyau stable dans la version
2.4.0. (Le développement du noyau 2.4 a débuté à partir d’une
branche de la version 2.2.8 du noyau, au travers de la série « non
stable » des noyaux 2.3.x.)
* Quand un appel système est marqué « 2.6 », cela signifie que l’appel
système est probablement apparu dans une version 2.5.x du noyau et
est apparu la première fois dans un noyau stable dans la version
2.6.0. (Le développement du noyau 2.6 a débuté à partir d’une
branche de la version 2.4.15 du noyau, au travers de la série « non
stable » des noyaux 2.5.x.)
* A partir du noyau 2.6.0, le mode de développement a changé et de
nouveaux appels système pourraient apparaître à chaque version
2.6.x. Dans ce cas, le numéro de version exact où l’appel système
est apparu est indiqué.
* Dans certains cas, un appel système a été ajouté à un noyau de la
série stable après l’embranchement provenant de la série stable
précédente, puis a été porté dans la série stable précédente du
noyau. Par exemple certains appels système apparus dans 2.6.x ont
été portés dans une version 2.4.x postérieure à la version 2.4.15.
Dans ce cas, les deux versions des deux séries majeures du noyau
dans lesquelles l’appel système est apparu sont mentionnées.
La liste des appels système qui sont disponibles dans la version 2.6.28
(ou dans certains cas pour certaines versions plus anciennes du noyau)
est la suivante :
Appel système Noyau Notes
------------------------------------------------------------------------
_llseek(2) 1.2
_newselect(2)
_sysctl(2)
accept(2)
accept4(2) 2.6.28
access(2)
acct(2)
add_key(2) 2.6.11
adjtimex(2)
afs_syscall(2) Pas implémenté
alarm(2)
alloc_hugepages(2) 2.5.36 Retiré dans 2.5.44
bdflush(2)
bind(2)
break(2) Pas implémenté
brk(2)
cacheflush(2) 1.2 Pas sur i386
capget(2) 2.2
capset(2) 2.2
chdir(2)
chmod(2)
chown(2)
chown32(2) 2.4
chroot(2)
clock_getres(2) 2.6
clock_gettime(2) 2.6
clock_nanosleep(2) 2.6
clock_settime(2) 2.6
clone(2)
close(2)
connect(2)
creat(2)
create_module(2)
delete_module(2)
dup(2)
dup2(2)
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)
exit(2)
exit_group(2) 2.6
faccessat(2) 2.6.16
fadvise64(2) 2.6
fadvise64_64(2) 2.6
fallocate(2) 2.6.23
fchdir(2)
fchmod(2)
fchmodat(2) 2.6.16
fchown(2)
fchown32(2) 2.4
fchownat(2) 2.6.16
fcntl(2)
fcntl64(2) 2.4
fdatasync(2)
fgetxattr(2) 2.6 ; 2.4.18
flistxattr(2) 2.6 ; 2.4.18
flock(2) 2.0
fork(2)
free_hugepages(2) 2.5.36 Supprimé dans 2.5.44
fremovexattr(2) 2.6 ; 2.4.18
fsetxattr(2) 2.6 ; 2.4.18
fstat(2)
fstat64(2) 2.4
fstatat64(2) 2.6.16
fstatfs(2)
fstatfs64(2) 2.6
fsync(2)
ftime(2) Pas implémenté
ftruncate(2)
ftruncate64(2) 2.4
futex(2) 2.6
futimesat(2) 2.6.16
get_kernel_syms(2)
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)
getegid32(2) 2.4
geteuid(2)
geteuid32(2) 2.4
getgid(2)
getgid32(2) 2.4
getgroups(2)
getgroups32(2) 2.4
getitimer(2)
getpeername(2)
getpagesize(2) 2.0 Pas sur i386
getpgid(2)
getpgrp(2)
getpid(2)
getpmsg(2) Pas implémenté
getppid(2)
getpriority(2)
getresgid(2) 2.2
getresgid32(2) 2.4
getresuid(2) 2.2
getresuid32(2) 2.4
getrlimit(2)
getrusage(2)
getsid(2) 2.0
getsockname(2)
getsockopt(2)
gettid(2) 2.4.11
gettimeofday(2)
getuid(2)
getuid32(2) 2.4
getxattr(2) 2.6 ; 2.4.18
gtty(2) Pas implémenté
idle(2) Pas implémenté
init_module(2)
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)
ioperm(2)
iopl(2)
ioprio_get(2) 2.6.13
ioprio_set(2) 2.6.13
ipc(2)
kexec_load(2) 2.6.7
keyctl(2) 2.6.11
kill(2)
lchown(2) 2.2
lchown32(2) 2.4
lgetxattr(2) 2.6 ; 2.4.18
link(2)
linkat(2) 2.6.16
listen(2)
listxattr(2) 2.6 ; 2.4.18
llistxattr(2) 2.6; 2.4.18
lock(2) Pas implémenté
lookup_dcookie(2) 2.6
lremovexattr(2) 2.6 ; 2.4.18
lseek(2)
lsetxattr(2) 2.6 ; 2.4.18
lstat(2)
lstat64(2) 2.4
madvise(2) 2.4
madvise1(2) 2.4
mbind(2) 2.6.6
migrate_pages(2) 2.6.16
mincore(2) 2.4
mkdir(2)
mkdirat(2) 2.6.16
mknod(2)
mknodat(2) 2.6.16
mlock(2)
mlockall(2)
mmap(2)
mmap2(2) 2.4
modify_ldt(2)
mount(2)
move_pages(2) 2.6.18
mprotect(2)
mpx(2) Pas implémenté
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)
mremap(2) 2.0
msgctl(2)
msgget(2)
msgrcv(2)
msgsnd(2)
msync(2) 2.0
munlock(2)
munlockall(2)
munmap(2)
nanosleep(2) 2.0
nfsservctl(2) 2.2
nice(2)
oldfstat(2)
oldlstat(2)
oldolduname(2)
oldstat(2)
olduname(2)
open(2)
openat(2) 2.6.16
pause(2)
pciconfig_iobase(2) 2.2.15; 2.4 Pas sur i386
pciconfig_read(2) 2.0.26; 2.2 Pas sur i386
pciconfig_write(2) 2.0.26; 2.2 Pas sur i386
personality(2) 1.2
phys(2) Pas implémenté
pipe(2)
pipe2(2) 2.6.27
pivot_root(2) 2.4
poll(2) 2.2
ppoll(2) 2.6.16
prctl(2) 2.2
pread64(2) Ajoué en tant que « pread »
dans 2.2 ; renommé
« pread64 » dans 2.6
preadv(2) 2.6.30
prof(2) Pas implémenté
profil(2) Pas implémenté
pselect6(2) 2.6.16
ptrace(2)
putpmsg(2) Pas implémenté
pwrite64(2) Ajoué en tant que « pwrite »
dans 2.2 ; renommé
« pwrite64 » dans 2.6
pwritev(2) 2.6.30
query_module(2) 2.2
quotactl(2)
read(2)
readahead(2) 2.4.13
readdir(2)
readlink(2)
readlinkat(2) 2.6.16
readv(2) 2.0
reboot(2)
recv(2)
recvfrom(2)
recvmsg(2)
remap_file_pages(2) 2.6
removexattr(2) 2.6; 2.4.18
rename(2)
renameat(2) 2.6.16
request_key(2) 2.6.11
restart_syscall(2) 2.6
rmdir(2)
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
sched_get_priority_max(2) 2.0
sched_get_priority_min(2) 2.0
sched_getaffinity(2) 2.6
sched_getparam(2) 2.0
sched_getscheduler(2) 2.0
sched_rr_get_interval(2) 2.0
sched_setaffinity(2) 2.6
sched_setparam(2) 2.0
sched_setscheduler(2) 2.0
sched_yield(2) 2.0
security(2) Pas implémenté
select(2)
semctl(2)
semget(2)
semop(2)
semtimedop(2) 2.6 ; 2.4.22
send(2)
sendfile(2) 2.2
sendfile64(2) 2.6 ; 2.4.19
sendmsg(2)
sendto(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
set_zone_reclaim(2) 2.6.13 Retiré dans 2.6.16
(n’a jamais été disponible
pour l’espace utilisateur)
setdomainname(2)
setfsgid(2) 1.2
setfsgid32(2) 2.4
setfsuid(2) 1.2
setfsuid32(2) 2.4
setgid(2)
setgid32(2) 2.4
setgroups(2)
setgroups32(2) 2.4
sethostname(2)
setitimer(2)
setpgid(2)
setpriority(2)
setregid(2)
setregid32(2) 2.4
setresgid(2) 2.2
setresgid32(2) 2.4
setresuid(2) 2.2
setresuid32(2) 2.4
setreuid(2)
setreuid32(2) 2.4
setrlimit(2)
setsid(2)
setsockopt(2)
settimeofday(2)
setuid(2)
setuid32(2) 2.4
setup(2) Retiré dans 2.2
setxattr(2) 2.6 ; 2.4.18
sgetmask(2)
shmat(2)
shmctl(2)
shmdt(2)
shmget(2)
shutdown(2)
sigaction(2)
sigaltstack(2) 2.2
signal(2)
signalfd(2) 2.6.22
signalfd4(2) 2.6.27
sigpending(2)
sigprocmask(2)
sigreturn(2)
sigsuspend(2)
socket(2)
socketcall(2)
socketpair(2)
splice(2) 2.6.17
spu_create(2) 2.6.16 PowerPC uniquement
spu_run(2) 2.6.16 PowerPC uniquement
ssetmask(2)
stat(2)
stat64(2) 2.4
statfs(2)
statfs64(2) 2.6
stime(2)
stty(2) Pas implémenté
swapoff(2)
swapon(2)
symlink(2)
symlinkat(2) 2.6.16
sync(2)
sync_file_range(2) 2.6.17
sysfs(2) 1.2
sysinfo(2)
syslog(2)
tee(2) 2.6.17
tgkill(2) 2.6
time(2)
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)
tkill(2) 2.6 ; 2.4.22
truncate(2)
truncate64(2) 2.4
tuxcall(2) Pas implémenté
ugetrlimit(2) 2.4
ulimit(2) Pas implémenté
umask(2)
umount(2)
umount2(2) 2.2
uname(2)
unlink(2)
unlinkat(2) 2.6.16
unshare(2) 2.6.16
uselib(2)
ustat(2)
utime(2)
utimensat(2) 2.6.22
utimes(2) 2.6
vfork(2)
vhangup(2)
vm86old(2)
vmsplice(2) 2.6.17
vserver(2) Pas implémenté
wait4(2)
waitid(2) 2.6.10
waitpid(2)
write(2)
writev(2) 2.0
Sur de nombreuses plates-formes, y compris les i386, les appels des
sockets sont multiplexés (par des fonctions de la glibc) à travers
socketcall(2) et de même les IPC System V via ipc(2).
NOTES
Veuillez noter les points suivants :
* Même si des entrées ont été réservées dans la table des appels
système, les appels système suivants ne sont pas implémentés :
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) et
vserver(2) (voir aussi unimplemented(2)). Toutefois, ftime(3),
profil(3) et ulimit(3) sont disponibles sous forme de fonctions de
bibliothèque. L’entrée pour phys(2) est utilisée pour umount(2)
depuis le 2.1.116, phys(2) ne sera jamais implémenté.
* Les appels getpmsg(2) et putpmsg(2) sont pour les noyaux modifiés
qui supportent les FLUX et ne seront peut-être jamais dans le noyau
standard.
En général, le code implémentant l’appel système ayant le numéro
__NR_xxx dans le fichier /usr/include/asm/unistd.h se trouve dans la
routine sys_xxx() du noyau. (La table de distribution pour la version
i386 se trouve dans /usr/src/linux/arch/i386/kernel/entry.S.) Il y a
néanmoins plusieurs exceptions, principalement lorsque d’anciens appels
système ont été remplacés par des nouveaux. Ces cas n’ont pas été
traités de manière homogène. Sur les plate-formes avec une émulation de
système propriétaire, comme parisc, sparc, sparc64 et alpha, il existe
de nombreux appels supplémentaires ; mips64 contient aussi un jeu
complet d’appels système 32-bits.
Avec le temps, des changements dans les interfaces de certains appels
système ont été nécessaires. Une raison pour ces changements a été
l’augmentation de la taille des structures ou des valeurs scalaires
passées aux appels système. À cause de ces changements, il y a
maintenant plusieurs implémentations de certains appels système (par
exemple truncate(2) et truncate64(2)). Ces différentes versions ne sont
pas compatibles au niveau binaire, mais les applications ne sont
généralement pas impactées par ceci : la magie de la glibc fait en
sorte que les binaires existants utilisent la version des appels
système qui existaient au moment où le binaire a été créé. Ainsi la
compatibilité de l’ABI est préservée. Voici des exemples d’appels
système qui existent dans plusieurs versions :
* À ce jour, il y a trois versions de stat(2) : sys_stat() (entrée
__NR_oldstat), sys_newstat() (entrée __NR_stat) et sys_stat64()
(entrée __NR_stat64), la dernière étant celle celle utilisée
actuellement. La même histoire s’applique à lstat(2) et fstat(2).
* De même, les définitions __NR_oldolduname, __NR_olduname et
__NR_uname concernent les routines sys_olduname(), sys_uname() et
sys_newuname().
* Dans Linux 2.0, une nouvelle version de vm86(2) est apparue,
l’ancienne et la nouvelle routine du noyau étant appelées
sys_vm86old() et sys_vm86().
* Dans Linux 2.4, une nouvelle version de getrlimit(2) est apparue,
l’ancienne et la nouvelle routine du noyau étant appelées
sys_old_getrlimit() (entrée __NR_getrlimit) et sys_getrlimit()
(entrée __NR_ugetrlimit).
* Linux 2.4 a augmenté la taille des identifiants d’utilisateur et de
groupe de 16 bits à 32 bits. Pour permettre ce changement, un jeu
d’appels système ont été ajoutés (par exemple, chown32(2),
getuid32(2), getgroups32(2), setresuid32(2)), surchargeant les
précédents appels système du même nom sans le suffixe « 32 ».
* Linux 2.4 a ajouté la gestion des gros fichiers pour les
applications sur architecture 32 bits (c’est-à-dire la gestion des
fichiers dont la taille et les décalages dans le fichier ne peuvent
pas être représentés sur des 32 bits). Pour gérer ce changement, des
appels système, qui utilisent des déplacements dans des fichiers ou
des tailles de fichiers, ont dû être remplacés. Ainsi, les appels
système suivants ont été ajoutés : fcntl64(2), ftruncate64(2),
getdents64(2), stat64(2), statfs64(2) et les appels système
analogues qui fonctionnent avec des descripteurs de fichier ou des
liens symboliques. Ces appels système remplacent les anciens appels
système qui, sauf pour les appels « stats », ont le même nom sans le
suffixe « 64 ».
Sur les plates-formes récentes qui n’ont que des accès aux fichiers
64-bits et des UID 32-bits (ex. alpha, ia64, s390x) il n’y a pas
d’appel *64 ou *32. Quand les appels *64 et *32 existent, les autres
versions sont obsolètes.
* Les appels rt_sig* ont été ajoutés dans le noyau 2.2 pour gérer
l’ajout des signaux temps-réel (voir signal(7)). Ces appels système
remplacent les appels précédents du même nom sans le préfixe
« rt_ ».
* Les appels système select(2) et mmap(2) utilisent 5 paramètres ou
plus, ce qui a posé des problèmes avec les méthodes classiques de
passage de paramètres sur i386. Ainsi, alors que les autres
architectures disposent de sys_select() et sys_mmap() correspondant
à __NR_select et __NR_mmap, on trouve sur les i386 old_select() et
old_mmap() à leur place. Ce sont des routines utilisant un pointeur
sur un bloc de paramètres. De nos jours, passer 5 paramètres n’est
plus un problème, et il existe donc un __NR__newselect correspondant
directement à sys_select() ; il en est de même pour __NR_mmap2.
VOIR AUSSI
syscall(2), unimplemented(2), libc(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».