intro

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



НАЗВАНИЕ
       intro - Системные вызовы: введение

ОПИСАНИЕ
       В этой главе описываются системные вызовы Linux.  Список этих 164
       системных вызовов находится в syscalls(2).

   Прямой вызов
       В большинстве случаев не требуется использовать системные вызовы
       напрямую, но бывают случаи, когда Стандартная Библиотека Языка C (libc)
       не реализует какую-нибудь полезную функцию.


   Краткая Сводка
       #include <linux/unistd.h>

       A _syscall macro

       desired system call


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

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

                     где X равно от 0 до 5 и означает количество аргументов,
                            принимаемых системным вызовом

                     type это тип, возвращаемый системным вызовом

                     name название системного вызова

                     typeN тип N-ого аргумента

                     argN имя N-ого аргумента

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

ПРИМЕР
       #include <stdio.h>
       #include <linux/unistd.h>     /* for _syscallX macros/related stuff */
       #include <linux/kernel.h>     /* for struct sysinfo */

       _syscall1(int, sysinfo, struct sysinfo *, info);

       /* Note: if you copy directly from the nroff source, remember to
       REMOVE the extra backslashes in the printf statement. */

       int main(void)
       {
            struct sysinfo s_info;
            int error;

            error = sysinfo(&s_info);
            printf("code error = %d\n", error);
               printf("Uptime = %ds\nLoad: 1 min %d / 5 min %d / 15 min %d\n"
                       "RAM: total %d / free %d / shared %d\n"
                       "Memory in buffers = %d\nSwap: total %d / free %d\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);
            return(0);
       }

Пример Выдачи
       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

ЗАМЕЧАНИЯ
       Макросы _syscall() НЕ создают прототипа.  Вам может потребоваться создать
       его вручную, особенно в программе на C++.

       Системные вызовы не обязательно возвращают только положительные или
       отрицательные коды ошибок.  Чтобы выяснить настоящее положение дел, может
       потребоваться обратиться к исходным текстам.  Обычно код ошибки -- это
       стандартный код ошибки со знаком минус, например, -EPERM.  Макросы
       _syscall() возвращают результат системного вызова r, если r
       неотрицательно, а в противном случае возвращают -1 и устанавливают
       переменную errno в значение -r.  Коды ошибок описаны в errno(3).

       Некоторые системные вызовы, такие как mmap, требуют больше пяти
       аргументов.  Они обрабатываются путем помещения аргументов на стек и
       передачи указателя на блок аргументов.

       При описании системного вызова аргументы ДОЛЖНЫ передаваться "по
       значению" или с помощью указателя (для агрегатных типов, например,
       структур).

СООТВЕТСТВИЕ СТАНДАРТАМ
       Для обозначение вариантов Unix и разнообразных стандартов, которым
       соответствуют системные вызовы, описанные в этой секции руководства,
       используются различные сокращения:

       SVr4   Unix-System V Release 4, описанная в "Programmer's Reference
              Manual: Operating System API (Intel processors)" (Prentice-Hall
              1992, ISBN 0-13-951294-2)

       SVID   System V Interface Definition (Описание Интерфейса Системы V),
              описанное в "The System V Interface Definition, Fourth Edition".

       POSIX.1
              IEEE 1003.1-1990 часть 1, также известный как ISO/IEC
              9945-1:1990s, также известный как "IEEE Portable Operating System
              Interface for Computing Environments" (Интерфейс Переносимой
              Операционной Системы для Вычислительных Сред IEEE), разъясненный в
              книге Donald Lewine "POSIX Programmer's Guide" (O'Reilly &
              Associates, Inc., 1991, ISBN 0-937175-73-0.

       POSIX.1b
              IEEE Std 1003.1b-1993 (стандарт POSIX.1b), описывающий возможности
              работы в реальном времени под переносимыми операционными
              системами, разъясненный в книге Bill O. Gallmeister "Programming
              for the real world - POSIX.4" (O'Reilly & Associates, Inc. ISBN
              1-56592-074-0).

       4.3BSD/4.4BSD
              Версии 4.3 и 4.4. дистрибуции Berkeley Unix.  4.4BSD была обратно
              совместима с 4.3.

       SUS, SUSv2
              Single Unix Specification.  (Разработана X/Open и The Open Group.
              Смотри также http://www.UNIX-systems.org/version2/.)

       V7     Версия 7, исходная версия Unix от Bell Labs.

ФАЙЛЫ
       /usr/include/linux/unistd.h

СМОТРИ ТАКЖЕ
       errno(3)

ПЕРЕВОД
       Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999



Linux 1.2.13                       22 May 1996                          INTRO(2)