Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       syscall - appel système indirect

SYNOPSIS

       #define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
       #include <unistd.h>
       #include <sys/syscall.h>   /* Pour les définitions de SYS_xxx */

       int syscall(int numéro, ...);

DESCRIPTION

       syscall()  est  une  petite  fonction  de  bibliothèque  qui  invoque l'appel système dont
       l'interface en assembleur a le numéro indiqué avec les arguments donnés. L'utilisation  de
       syscall()  est  pratique,  par  exemple,  pour  invoquer  un  appel système qui n'a pas de
       fonction autour de cet appel système dans la bibliothèque C.

       syscall() sauve les registres du processeur avant de faire l'appel système,  restaure  les
       registres  au  retour  de  l'appel  système et stocke tous les codes d'erreur renvoyés par
       l'appel système dans errno(3) en cas d'erreur.

       Les constantes symboliques correspondant aux appels système sont dans le fichier d'en-tête
       <sys/syscall.h>.

VALEUR RENVOYÉE

       La  valeur  de  retour  est définie par l'appel système invoqué. En général, une valeur de
       retour nulle indique une réussite. Une valeur de retour de -1 indique une  erreur,  et  un
       code d'erreur est fourni dans errno.

NOTES

       syscall() est apparu dans BSD 4.

   Exigences dépendantes de l'architecture
       L'ABI  de  chaque  architecture  possède  ses  propres  exigences  sur  la  façon dont les
       paramètres des appels système sont passés au noyau. Pour les appels système  qui  ont  une
       fonction  d'enrobage  de la glibc (comme par exemple la plupart des appels système), glibc
       s'occupe des détails pour copier les arguments  dans  les  bons  registres  d'une  manière
       adaptée  à chaque architecture. Cependant, en utilisant syscall()  pour effectuer un appel
       système,  l'appelant  peut  avoir  besoin  de  gérer  certains   détails   dépendants   de
       l'architecture ;  cette exigence est en particulier rencontrée sur certaines architectures
       32 bits.

       Par exemple, pour  l'Embedded  ABI  (EABI)  de  l'architecture  ARM,  une  valeur  64 bits
       (c'est-à-dire un long long)  doit être alignée sur une paire de registres paire. Ainsi, en
       appelant syscall()  au lieu de la  fonction  d'enrobage  fournie  par  la  glibc,  l'appel
       système readahead()  devrait être effectué ainsi sur l'architecture ARM avec l'EABI :

           syscall(SYS_readahead, fd, 0,
                   (unsigned int) (offset >> 32),
                   (unsigned int) (offset & 0xFFFFFFFF),
                   count);

       Comme  le  paramètre  offset  est 64 bits, et le premier argument (fd)  est passé dans r0,
       l'appelant doit manuellement découper et aligner la valeur 64 bits afin de la passer  dans
       la paire de registres r2/r3. Ceci implique de passer une valeur fantôme dans r1 (le second
       argument, qui vaut 0).

       Des problèmes similaires peuvent survenir sur MIPS avec l'ABI O32, sur PowerPC avec  l'ABI
       32 bits, et sur Xtensa.

       Les  appels  système  concernés  sont  fadvise64_64(2),  ftruncate64(2), posix_fadvise(2),
       pread64(2), pwrite64(2), readahead(2), sync_file_range(2) et truncate64(2).

   Conventions d'appel par architecture
       Chaque architecture possède sa façon propre d'invoquer et  de  passer  des  paramètres  au
       noyau.  Les  détails  pour  diverses  architectures  sont  donnés  dans  les deux tableaux
       ci-dessous.

       Le premier tableau donne l'instruction utilisée pour passer en mode noyau (qui  n'est  pas
       forcément  la  méthode la meilleure ou la plus rapide, vous devriez consulter vdso(7)), le
       registre utilisé pour indiquer le numéro de l'appel système, et le registre utilisé  comme
       code de retour de l'appel système.

       arch/ABI   instruction          appel syst.   val. ret. Notes
       ─────────────────────────────────────────────────────────────────────────
       arm/OABI   swi NR               -             a1        NR :      numéro
                                                               d'appel syst.
       arm/EABI   swi 0x0              r7            r0
       blackfin   excpt 0x0            P0            R0
       i386       int $0x80            eax           eax
       ia64       break 0x100000       r15           r10/r8    erreur
                                                               booléenne/
                                                               valeur errno
       parisc     ble 0x100(%sr2, %r0) r20           r28
       s390       svc 0                r1            r2        Voir ci-dessous.
       s390x      svc 0                r1            r2        Voir ci-dessous
       sparc/32   t 0x10               g1            o0
       sparc/64   t 0x6d               g1            o0
       x86_64     syscall              rax           rax

       Pour  s390  and  s390x, NR (le numéro de l'appel système) peut être passé directement avec
       "svc NR" si NR est inférieur à 256.

       Le second tableau montre les registres utilisés pour  passer  les  paramètres  de  l'appel
       système.

       arch/ABI   par1   par2   par3   par4   par5   par6   par7
       ──────────────────────────────────────────────────────────
       arm/OABI   a1     a2     a3     a4     v1     v2     v3
       arm/EABI   r0     r1     r2     r3     r4     r5     r6
       blackfin   R0     R1     R2     R3     R4     R5     -
       i386       ebx    ecx    edx    esi    edi    ebp    -
       ia64       out0   out1   out2   out3   out4   out5   -
       parisc     r26    r25    r24    r23    r22    r21    -
       s390       r2     r3     r4     r5     r6     r7     -
       s390x      r2     r3     r4     r5     r6     r7     -
       sparc/32   o0     o1     o2     o3     o4     o5     -
       sparc/64   o0     o1     o2     o3     o4     o5     -
       x86_64     rdi    rsi    rdx    r10    r8     r9     -

       Notez  que  ces  tableaux  ne  couvrent  pas  l'ensemble  des conventions d'appel système,
       certaines architectures peuvent écraser d'autres registres non listés ici.

EXEMPLE

       #define _GNU_SOURCE
       #include <unistd.h>
       #include <sys/syscall.h>
       #include <sys/types.h>
       #include <signal.h>

       int
       main(int argc, char *argv[])
       {
           pid_t tid;

           tid = syscall(SYS_gettid);
           tid = syscall(SYS_tgkill, getpid(), tid, SIGHUP);
       }

VOIR AUSSI

       _syscall(2), intro(2), syscalls(2), vdso(7)

COLOPHON

       Cette page fait partie de la publication 3.65 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

       Depuis   2010,   cette   traduction   est   maintenue   à   l'aide   de    l'outil    po4a
       <http://po4a.alioth.debian.org/>  par l'équipe de traduction francophone au sein du projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Thierry Vignaud (2002), Alain Portal <http://manpagesfr.free.fr/> (2006).  Julien  Cristau
       et l'équipe francophone de traduction de Debian (2006-2009).

       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> ».