_syscall(2)

ИМЯ
_syscall - выполняет системный вызов, который не поддерживается библиотекой (УСТАРЕЛ)

СИНТАКСИС
#include <linux/unistd.h>

Макрос _syscall

желаемый системный вызов

ОПИСАНИЕ
При использовании системного вызова необходима информация о его прототипе. Вам нужно знать количество аргументов, их типы и тип возвращаемого значения. Есть несколько макросов, которые облегчают выполнение системных вызовов. Они имеют вид:

    _syscallX(type,name,type1,arg1,type2,arg2,…)

где

    X is 0–6, which are the number of arguments taken by the system call

    type — тип возвращаемого значения системного вызова

    name — имя системного вызова

    typeN — тип N-го аргумента

    argN — имя N-го аргумента

Эти макросы создают функцию с именем name и указанными аргументами. После добавления _syscall() в код, вы можете вызывать системный вызов по имени name.

ФАЙЛЫ
/usr/include/linux/unistd.h

СТАНДАРТЫ
Linux.

ИСТОРИЯ
Starting around Linux 2.6.18, the _syscall macros were removed from header files supplied to user space. Use syscall(2) instead. (Some architectures, notably ia64, never provided the _syscall macros; on those architectures, syscall(2) was always required.)

ЗАМЕЧАНИЯ
Макрос _syscall() не создаёт прототип. Вам, вероятно, придётся создавать его самостоятельно, особенно пользователям C++.

Для системных вызовов не требуется возвращать только положительный или отрицательный код ошибки. Вам нужно прочитать исходный код, чтобы выяснить как возвращаются ошибки. Обычно, это отрицательный стандартный код ошибки, например, -EPERM. Макрос _syscall() возвращает результат r из системного вызова, если r неотрицательно, но вернёт -1 и установит значение errno равное -r, когда r отрицательно. Коды ошибок смотрите в errno(3).

При определении системного вызова типы аргументов должны передаваться по значению или по ссылке (для составных типов, например структур).

ПРИМЕРЫ
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <linux/unistd.h>       /* for _syscallX macros/related stuff */
    #include <linux/kernel.h>       /* for struct sysinfo */

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

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

        error = sysinfo(&s_info);
        printf("code error = %d\n", error);
        printf("Uptime = %lds\nLoad: 1 min %lu / 5 min %lu / 15 min %lu\n"
               "RAM: total %lu / free %lu / shared %lu\n"
               "Memory in buffers = %lu\nSwap: total %lu / free %lu\n"
               "Number of processes = %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);
    }

  Результат работы примера
    code error = 0
    uptime = 502034s
    Load: 1 min 13376 / 5 min 5504 / 15 min 1152
    RAM: total 15343616 / free 827392 / shared 8237056
    Memory in buffers = 5066752
    Swap: total 27881472 / free 24698880
    Number of processes = 40

СМ. ТАКЖЕ
intro(2), syscall(2), errno(3)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Yuri Kozlov <yuray@komyakino.ru>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.