从程序完成的功能来看,函数库提供的函数通常是不需要操作 系统 的服务. 函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的。系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。
 
      函数库的函数,尤其与输入输出相关的函数,大多必须通过 Linux 的系统调用来完成。因此我们可以将函数库的函数当成应用程序设计人员与系统调用程序之间的一个中间层,通过这个中间层,我们可以用一致的接口来安全的调用系统调用。这样程序员可以只要写一次代码就能够在不同版本的linux系统间使用积压种具体实现完全不同的系统调用。至于如何实现对不同的系统调用的兼容性问题,那是函数库开发者所关心的问题。
      从程序执行效率来看,系统调用的执行效率大多要比函数高,尤其是处理输入输出的函数。当处理的数据量比较小时,函数库的函数执行效率可能比较好,因为函数库的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高,但是在进行系统调用时,因为用户进程从用户模式进入系统核心模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。但是当要处理的数据量比较大时,例如当输入输出的数据量超过文件系统定义的尽寸时,利用系统调用可获得较高的效率。
      从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库(ANSI C) 具备较高的可移植性,在不同的系统环境下,只要做很少的修改,通常情况是不需要修改的。
 
Linux C中库函数和系统调用的区别 www.2cto.com
 
摘自:The Linux Kernel Module Programming Guide
 
      库函数是高层的,完全运行在用户空间, 为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用write()输出这些字符串。
 
是否想看一看printf()究竟使用了哪些系统调用? 这很容易,编译下面的代码。
 
#include <stdio.h>
int main(void)
{
    printf("hello");
    return 0;
}
 
使用命令
 
gcc -Wall -o hello hello.c
 
编译。用命令strace hello 跟踪该可执行文件。是否很惊讶? 每一行都和一个系统调用相对应。strace是一个非常有用的程序,它可以告诉你程序使用了哪些系统调用和这些系统调用的参数,返回值。 这是一个极有价值的查看程序在干什么的工具。在输出的末尾,你应该看到这样类似的一行write(1, "hello", 5hello)。这就是我们要找的。藏在面具printf() 的真实面目。既然绝大多数人使用库函数来对文件I/O进行操作(像fopen, fputs, fclose)。 你可以查看man说明的第二部分使用命令man 2 write 。man说明的第二部分专门介绍系统调用(像kill()和read())。man说明的第三部分则专门介绍你可能更熟悉的库函数(像cosh()和random())。
你甚至可以编写代码去覆盖系统调用,正如我们不久要做的。骇客常这样做来为系统安装后门或木马。 但你可以用它来完成一些更有益的事,像让内核在每次某人删除文件时输出 “Tee hee, that tickles!” 的信息。

系统调用和库函数调用的区别相关推荐

  1. Unix——系统调用和库函数调用概念区别和联系

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思 ...

  2. (转)Linux系统调用和库函数调用的区别

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions). 系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意 ...

  3. linux系统调用和库函数调用的区别

    1.系统调用 系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h.以write为例:其函数原型为 size_t write(int fd ...

  4. 转载 linux系统调用和库函数调用的区别

    源地址 http://blog.csdn.net/zhangskd/article/details/6956638 Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(L ...

  5. 系统调用和库函数调用

    借鉴https://blog.csdn.net/lf_2016/article/details/54587020 系统调用:用户直接调用操作系统暴露出来的接口,这种方式成为系统调用. 文件I/O操作就 ...

  6. linux中系统调用和库函数的区别

    linux中系统调用和库函数的区别 2013-05-03 22:18:20 分类: LINUX 首先,要说一下两者的概念: 系统调用 :是操作系统为用户态运行的进程和硬件设备(如CPU.磁盘.打印机等 ...

  7. 系统调用和库函数的区别

    首先,要说一下两者的概念: 系统调用 :是操作系统为用户态运行的进程和硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层.可以说是操作系统留给用 ...

  8. 操作系统原理,系统调用,系统调用与库函数API等函数之间的调用关系,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB

    操作系统原理,系统调用,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB 一.系统调用:操作系统功能调用,用户在编程时可以调用的操作系统功能. 1.系统调用是操作 ...

  9. 点击网页跟踪php代码的工具,使用ltrace工具跟踪PHP库函数调用的方法

    本文实例讲述了使用ltrace工具跟踪PHP库函数调用的方法.分享给大家供大家参考,具体如下: 可能大家已经很熟悉使用strace来跟踪系统调用,今天介绍一个跟踪库函数的利器ltrace 比如我有这么 ...

最新文章

  1. C++ 获取当前时间的年,月,日,以及时分秒
  2. C#从数据库导出数据[excel]
  3. v深入研究Clang(四) Clang编译器的简单分析
  4. 基于单片机的水壶自动加热系统_基于单片机的智能热水壶设计说明
  5. Java高并发编程(九):Java中原子操作类
  6. 在 Mac上压缩的压缩包 在windows上都会产生.DS_Store这种垃圾文件 怎么办
  7. [NOIP2015] 子串
  8. Windows下编写的脚本文件无法在Linux上运行的问题
  9. 拿来就能用!这本 Python 3.6 的实战书火爆了 IT 圈!
  10. 【Coursera公开课】职场素养 笔记
  11. 服务器如何选择固态硬盘,服务器固态硬盘如何挑选?
  12. 影子系统、还原精灵、冰点还原优缺点比较
  13. 糯米美团再获融资,团购硝烟再起
  14. java学习笔记第三周(二)
  15. 广东迅视资管 别让“顺风车”再度行驶至安全边缘
  16. Modbus之Nmodbus的下载和使用
  17. vector 多维向量定义及其初始化
  18. 2021-11-2记一次win7下python两种版本的完全安装
  19. 阿里云SLB最佳实践
  20. canvas制作在线画板

热门文章

  1. FragmentTabHost切换Fragment时避免重复加载UI
  2. WinApi学习笔记-获取电脑中磁盘信息
  3. 开始喜欢Python了
  4. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单
  5. python发明者叫什么-python是谁的
  6. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
  7. python下载地址-python下载网址
  8. python手机版怎么用-手机使用python操作图片文件(pydroid3)过程详解
  9. python画柱形图-Python数据分析:柱形图的绘制方法
  10. python开发微信小程序-Python 开发者的微信小程序开发实践