系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。下面介绍Linux 下三种发生系统调用的方法:

一、通过 glibc 提供的库函数
glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 API(Application Programming Interface),除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。那么glibc提供的系统调用API与内核特定的系统调用之间的关系是什么呢?

通常情况,每个特定的系统调用对应了至少一个 glibc 封装的库函数,如系统提供的打开文件系统调用 sys_open 对应的是 glibc 中的 open 函数; 其次,glibc 一个单独的 API 可能调用多个系统调用,如 glibc 提供的 printf 函数就会调用如 sys_open、sys_mmap、sys_write、sys_close 等等系统调用; 另外,多个 API 也可能只对应同一个系统调用,如glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。
举例来说,我们通过 glibc 提供的chmod 函数来改变文件 etc/passwd 的属性为 444:

#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <stdio.h>int main(){ int rc; rc = chmod("/etc/passwd", 0444); if (rc == -1) fprintf(stderr, “chmod failed, errno = %d\n”, errno); else printf(“chmod success!\n”); return 0;}
在普通用户下编译运用,输出结果为:

chmod failed, errno = 1
上面系统调用返回的值为-1,说明系统调用失败,错误码为1,在 /usr/include/asm-generic/errno-base.h 文件中有如下错误代码说明:

#define EPERM 1 /* Operation not permitted */
即无权限进行该操作,我们以普通用户权限是无法修改 /etc/passwd 文件的属性的,结果正确。宝宝起名宝典

二、使用 syscall 直接调用
使用上面的方法有很多好处,首先你无须知道更多的细节,如 chmod 系统调用号,你只需了解 glibc 提供的 API 的原型;其次,该方法具有更好的移植性,你可以很轻松将该程序移植到其他平台,或者将 glibc 库换成其它库,程序只需做少量改动。
但有点不足是,如果 glibc 没有封装某个内核提供的系统调用时,我就没办法通过上面的方法来调用该系统调用。如我自己通过编译内核增加了一个系统调用,这时 glibc 不可能有你新增系统调用的封装 API,此时我们可以利用 glibc 提供的syscall 函数直接调用。该函数定义在 unistd.h 头文件中,函数原型如下:

long int syscall (long int sysno, …)

sysno 是系统调用号,每个系统调用都有唯一的系统调用号来标识。在 sys/syscall.h 中有所有可能的系统调用号的宏定义。 … 为剩余可变长的参数,为系统调用所带的参数,根据系统调用的不同,可带0~5个不等的参数,如果超过特定系统调用能带的参数,多余的参数被忽略。 返回值 该函数返回值为特定系统调用的返回值,在系统调用成功之后你可以将该返回值转化为特定的类型,如果系统调用失败则返回 -1,错误代码存放在 errno 中。

三种方法实现Linux系统调用方法分享相关推荐

  1. Linux操作系统下三种配置环境变量的方法(linux下几种profile执行顺序)

    http://www.linuxeden.com/html/sysadmin/20080424/56879.html 现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量, ...

  2. [zz]Linux操作系统下三种配置环境变量的方法

    个人的总结: 设置了/etc/profile 和 ~/.bashrc 之后,使用了source 命令,是可以echo添加的变量,但是用getenv读不出来,然后使用env命令也显示不出来,是因为没有e ...

  3. Linux操作系统下三种配置环境变量的方法

    现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作 ...

  4. linux进入字符界面的登录密码,三种进入CentOS界面字符方法

    三种进入CentOS界面字符方法 在CentOS界面切换问题中,也许很多人习惯进入字符工作方式来进行操作.那么如何切换到字符工作方式呢?下面我们就来介绍3种方法来进入字符工作方式: 在图形环境下开启终 ...

  5. 计算机的自带拍视频教程,在线网络课程视频如何录制?三种快速录制视频的方法...

    原标题:在线网络课程视频如何录制?三种快速录制视频的方法 怎么录制在线网络课程视频?前段时间在网上买了一套英语口语快速提升班的课程,但是看过一遍之后很快就忘记了,加上网课快到期了,过期后不能回看.在小 ...

  6. python list遍历 间隔_Python 列表(List) 的三种遍历(序号和值)方法

    #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list = ['html', 'js', 'css' ...

  7. php冒泡 插入选择 排序,说说PHP数组的三种排序(冒泡/选择/插入)方法

    说说PHP数组的三种排序(冒泡/选择/插入)方法 PHP #数组 #排序 #冒泡 #选择 #插入2012-05-30 10:17 一.冒泡排序法 说明:找到最大的数,排列到最后面,然后继续找 例: $ ...

  8. iis搭建php出现301,IIS服务器PHP下三种实现301重定向的方法

    IIS服务器PHP下三种实现301重定向的方法 来源:重庆SEO作者:杨南强 2012-05-07 08:47 我来投稿参与评论 301重定向:301代表永久性转移,301重定向是网页更改地址后对搜索 ...

  9. win7系统wifi没有网络连接到服务器,Win7无线Wifi无法连接怎么办?win7系统Wifi无法连接的三种故障原因及解决方法...

    当我们准备接入一个Wifi的时候,发现怎么样都连不进去,该怎么办呢?一般出现该问题基本是由于"WiFi密码不正确" ."Win7中保存的WiFi记录与路由器中不符&quo ...

最新文章

  1. 人工智能AI-机器视觉CV-数据挖掘DM-机器学习ML-神经网络-[资料集合贴]
  2. PAT甲级1055 The World‘s Richest:[C++题解]k路归并
  3. html怎样做登录页面,使用HTML 5和CSS3制作登录页面完整步骤
  4. OpenGL Sharders(着色器) 入门
  5. yum安装ruby_rediscluster安装
  6. java如何画矩形条和填充_java.awt.Graphics 类的哪个方法可绘制填充矩形?
  7. HTTP和HTTPS的区别及HTTPS加密算法
  8. java 新项目计划_Java的新项目学成在线笔记-day6(十二)
  9. ERP系统之JPJDE入门-1 JDE 简史
  10. 关于网页点击按钮无响应问题分析
  11. 高效工作-使用石墨文档进行信息收集
  12. java设计模式之-策略模式
  13. Centos挂载iscsi存储(浪潮存储)
  14. 解决 python plt画柱状图(棒状图)时横坐标刻度线不在中间而在右边
  15. 商城APP软件开发要素有哪些
  16. 百度云下载不限速方法合集
  17. 面试知识点——(金三银四你需要的是她)
  18. CheckBox设置不可点击
  19. Jmeter简单操作
  20. 洛谷B2092 开关灯(样本观察)

热门文章

  1. cocos2x (c++/lua) spine 文件的预加载
  2. Socket网络编程--简单Web服务器(2)
  3. 1.1 开始起步,配置ruby on rails运行环境
  4. 五大主流深度学习框架Google趋势比较
  5. Discuz验证码识别(上线篇)-写给程序员的TensorFlow教程
  6. linux星期六字符,linux shell系列10 判断某个月中的星期六和星期天
  7. MyBatis ofType和javaType区别
  8. spring-boot项目打包时候出现boot-inf文件夹的问题
  9. 002_Spring Data JPA CRUD
  10. 043_CSS32D转换