table of contents
- bookworm 4.18.1-1
- bookworm-backports 4.25.1-1~bpo12+1
- testing 4.25.1-1
- unstable 4.25.1-1
_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
СМОТРИТЕ ТАКЖЕ¶
ПЕРЕВОД¶
Русский перевод этой страницы руководства разработал(и) 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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
15 июня 2024 г. | Справочные страницы Linux 6.9.1 |