syscall(2)

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

_syscall(2) — Linux manual page

NAMN

_syscall - anropa ett systemanrop utan biblioteksstöd (FÖRÅLDRAD)

SYNOPSIS

```c

  1. include <linux/unistd.h>

En _syscall-makro

önskat systemanrop ```

BESKRIVNING

För att använda ett systemanrop behöver du känna till dess prototyp: antalet argument, deras typer och returtypen. Det finns sju makron som underlättar själva anropet till systemet. De har formen:

```c _syscallX(typ, namn, typ1, arg1, typ2, arg2, ...) ```

där:

- **X** är 0–6, vilket motsvarar antalet argument som systemanropet tar. - **typ** är returtypen för systemanropet. - **namn** är namnet på systemanropet. - **typN** är typen för det N:te argumentet. - **argN** är namnet på det N:te argumentet.

Dessa makron skapar en funktion med namnet du anger och de specifika argumenten. När du inkluderar _syscall() i din källkod kan du anropa systemanropet med dess namn.

FILER

/usr/include/linux/unistd.h

STANDARDER

Linux.

HISTORIK

Från och med Linux 2.6.18 togs _syscall-makrona bort från header-filer som tillhandahålls för användarutrymmet. Använd istället syscall(2). Vissa arkitekturer, särskilt ia64, tillhandahöll aldrig _syscall-makrona; på dessa arkitekturer krävdes alltid syscall(2).

ANMÄRKNINGAR

_syscall()-makrona genererar ingen prototyp. Du kan behöva skapa en, särskilt för C++-användare.

Systemanrop är inte begränsade till att returnera endast positiva eller negativa felkoder. Du behöver läsa källkoden för att vara säker på hur fel returneras. Vanligtvis är det den negativa motsvarigheten till en standardfelkod, till exempel -EPERM. _syscall()-makrona returnerar resultatet r av systemanropet när r är icke-negativt, men returnerar -1 och sätter variabeln errno till -r när r är negativt. För felkoder, se errno(3).

När du definierar ett systemanrop måste argumenttyperna överföras som värden eller som pekare (för aggregat som strukturer).

EXEMPEL

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/unistd.h>       /* för _syscallX-makron/relaterade saker */
#include <linux/kernel.h>       /* för struct sysinfo */

_syscall1(int, sysinfo, struct sysinfo *, info);

int main(void)
{
    struct sysinfo s_info;
    int error;

    error = sysinfo(&s_info);
    printf("felkod = %d\n", error);
    printf("Uptime = %lds\nLaddning: 1 min %lu / 5 min %lu / 15 min %lu\n"
           "RAM: totalt %lu / ledigt %lu / delat %lu\n"
           "Minne i buffertar = %lu\nSwap: totalt %lu / ledigt %lu\n"
           "Antal processer = %d\n",
           s_info.uptime, s_info.loads[0],
           s_info.loads[1], s_info.loads[2],
           s_info.totalram, s_info.freeram,
           s_info.sharedram, s_info.bufferram,
           s_info.totalswap, s_info.freeswap,
           s_info.procs);
    exit(EXIT_SUCCESS);
}

Exempel på utdata:

``` felkod = 0 Uptime = 502034s Laddning: 1 min 13376 / 5 min 5504 / 15 min 1152 RAM: totalt 15343616 / ledigt 827392 / delat 8237056 Minne i buffertar = 5066752 Swap: totalt 27881472 / ledigt 24698880 Antal processer = 40 ```

SE ÄVEN

intro(2), syscall(2), errno(3)

COLOFON

Denna sida är en del av man-pages-projektet (dokumentation för Linux-kärnans och C-bibliotekets användarutrymmesgränssnitt). Information om projektet finns på ⟨https://www.kernel.org/doc/man-pages/⟩. Om du har en felrapport för denna man-sida, se ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩. Denna sida hämtades från tarballen man-pages-6.9.1.tar.gz från ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩.