_SYSCALL - Linux手册页

时间:2019-08-20 17:58:34  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2020-06-09

名称

_syscall-调用不带库支持的系统调用(OBSOLETE)

语法

#包括

_syscall宏

所需的系统调用

说明

有关系统调用的重要信息是其原型。您需要知道多少个参数,它们的类型以及函数的返回类型。有七个宏可以简化对系统的实际调用。它们具有以下形式:

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

哪里

X为0-6,这是系统调用采用的参数数量
type是系统调用的返回类型
name是系统调用的名称
typeN是第N个参数的类型
argN是第N个参数的名称

这些宏使用您指定的参数创建一个名为name的函数。一旦在源文件中包含_syscall(),就可以按名称调用系统调用。

文件

/usr/include/linux/unistd.h

遵循规范

这些宏的使用特定于Linux,并且已弃用。

备注

从内核2.6.18开始,从提供给用户空间的头文件中删除了_syscall宏。请改用syscall(2)。 (某些体系结构,尤其是ia64,从未提供_syscall宏;在这些体系结构上,始终需要syscall(2)。)

_syscall()宏不会产生原型。您可能必须创建一个,尤其是对于C ++用户。

不需要系统调用仅返回正或负错误代码。您需要阅读源代码以确保它将如何返回错误。通常,它是标准错误代码(例如-EPERM)的负数。 _syscall()宏将在r为非负数时返回系统调用的结果r,但在r为负数时将返回-1并将变量errno设置为-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);
}

Sample output

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

另外参见

简介(2),系统调用(2),错误(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/