Provided by: manpages-ru-dev_4.27.0-1_all bug

_syscall(2)                                    System Calls Manual                                   _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.

ИСТОРИЯ

       Начиная  примерно  с  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>       /* 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> и Kirill  Rekhov
       <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                     _syscall(2)