Scroll to navigation

_SYSCALL(2) Руководство программиста Linux _SYSCALL(2)

ИМЯ

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

ОБЗОР

#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

СМОТРИТЕ ТАКЖЕ

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

2007-12-19 Linux