Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       _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 и они устарели.

ЗАМЕЧАНИЯ

       Начиная, приблизительно, с ядра 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 <yuray@komyakino.ru>

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

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