ИМЯ
_syscall - выполняет системный вызов, который не поддерживается библиотекой (УСТАРЕЛ)СИНТАКСИС
#include <linux/unistd.h>
Макрос _syscall
желаемый системный вызов
ОПИСАНИЕ
При использовании системного вызова необходима информация о его прототипе. Вам нужно знать количество аргументов, их типы и тип возвращаемого значения. Есть несколько макросов, которые облегчают выполнение системных вызовов. Они имеют вид:_syscall X(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-го аргумента
ФАЙЛЫ
/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); 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 <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]5 февраля 2023 г. | Linux man-pages 6.03 |