_syscall(2) выполняет системный вызов, который не поддерживается библиотекой

ОБЗОР

#include <linux/unistd.h>

Макрос _syscall

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

ОПИСАНИЕ

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

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

где

X 0-6, количество аргументов, принимаемых системным вызовом
type --- тип возвращаемого значения системного вызова
name --- имя системного вызова
typeN --- тип N-го аргумента
argN --- имя N-го аргумента

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

ФАЙЛЫ

/usr/include/linux/unistd.h

СООТВЕТСТВИЕ СТАНДАРТАМ

Эти макросы есть только в Linux и они устарели.

ЗАМЕЧАНИЯ

Начиная, приблизительно, с ядра 2.6.18, макросы _syscall удалены из заголовочных файлов, используемых в пользовательском пространстве. Вместо них используйте syscall(2). (Для некоторых архитектур, например ia64, макросы _syscall никогда не предоставлялись; на таких архитектурах всегда требуется макрос syscall(2).)

Макрос _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>       /* поддержка _syscallX */
#include <linux/kernel.h>       /* struct sysinfo */
_syscall1(int, sysinfo, struct sysinfo *, info);
/* Замечание: если вы копируете непосредственно из
исходного nroff-кода страницы, не забудьте
УДАЛИТЬ лишние символы обратной косой черты в операторе printf. */
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