当前位置:  技术问答>linux和unix

关于库函数和系统调用的区别

    来源: 互联网  发布时间:2017-02-10

    本文导语:  书上说;若干个库函数可以映射到一个系统调用入口点,比如exec有几种不同的调用方式,如execl 和execle,它们为同一系统调用提供不同接口。对于这些系统调用,它们的库函数对它们各自的参数加以处理,但最终的...

书上说;若干个库函数可以映射到一个系统调用入口点,比如exec有几种不同的调用方式,如execl 和execle,它们为同一系统调用提供不同接口。对于这些系统调用,它们的库函数对它们各自的参数加以处理,但最终的,这些库函数都映射到一个内核入口点。那到底什么是系统调用,什么是库函数。写程序时用的execl是系统调用还是库函数。这里面的库函数和C语言所说的库函数(如printf)有什么区别?我原以为像printf这样的称之为库函数而像creat,execl这样都叫做系统调用,好像这样理解不太正确,还有操作系统API又怎么界定,他属于系统调用还是系统调用的包装。

|
这个问题是这样的:

1. 首先,现在的OS内核主要采用两种模式,整体的单内核模式(linux)和分层的微内核模式(Windows)。单内核

模式的特点就是代码紧凑,执行速度快,各个模块之间是直接的调用关系,可以说最后一点既是优点,也是缺

点...有点就是执行速度快,缺点是内核看起来很乱,维护起来困难。

2. 无论是单内核,还是微内核,立体的体系结构从下到上大概都是分成这样几层:物理硬件,OS内核,OS服务,

应用程序。这四层结构中,OS内核起到一个“承上启下”的作用,向下管理物理硬件;向上为OS服务和应用程序

提供接口。主意,这里的接口实际上是指系统调用(System Call)。

3. 通常OS内核为了考虑实现起来的难度和易于管理,只提供少部分必要的系统调用,这些系统调用通常都是C和

汇编混编来实现的。接口用C定义,实现体用汇编来写。这样做的好处是,执行效率高,并且极大的方便了上层的

调用。

4. 再说库函数(即API)。库函数可以概括的分为两类,一类是随OS提供的,另一类是第三方的。随系统提供的库

函数进一步封装或组合系统调用,实现更多的功能,就像用C语言的许多功能单一的小函数来实现很多很多个功能

复杂的大函数一样。这样的API能够执行一些相对内核来说很复杂的操作,比如,read()函数根据参数,直接就

能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些操作,程序员

是不必关心的,这些操作里面自然也包含了系统调用。而对于第三方的库,它其实和系统库一样,只是它直接利

用系统调用的可能性要小一些,而是利用系统提供的API接口来实现功能。(API的接口是开放的)

大概就这么多吧,想到哪写到哪,组织的也很凌乱,希望对楼主有帮助...

|
我的理解是:系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数。

|
很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为了用户态的使用
例如:
我自己定义一个系统调用sys_mycall,这个只能内核态调用,要在用户态编程使用时,需用函数_syscallN(N表示需要传给系统调用的参数个数)宏来将其声明,这样在我们自己的程序中就可以使用mycall函数了

写程序直接使用的是库函数,而库函数内部可能就是调用的同名系统调用,这样是否好理解一点?

    
 
 

您可能感兴趣的文章:

  • 调用数学函数,需要调用哪个函数库?
  • Linux添加系统调用时如何调用C语言库函数
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • 我如何调用 内核函数 /linux/fs 里面的内核 函数:比如 自己的程序调用 ext3_delete_inode
  • linux中为什么系统调用比普通函数调用更费时间?
  • 在内核的某个函数中,如何能知道是哪个用户空间的函数调用了它,以及这个用户空间函数所在的文件?
  • linux中,动态库中的函数如何调用静态库中的函数
  • 一个父类的构造函数的参数是(Applet applet),请问它的子类构造函数当中应怎样调用父类构造函数?
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 利用 mount 函数 如何 挂载 ntfs 分区,如何调用(不是命令,是 MOUNT 函数)
  • 如果忘了某个系统调用函数,比如只记得函数名的几个关键字,如何查?
  • gcc中,一个.c文件中的函数,如何调用另一个.c文件中的函数?
  • UNIX C函数中是否有类似“ls”的函数调用?
  • 一个基本概念问题:静态函数只能调用静态方法,类的成员函数也是静态的吗?
  • 在SQL中有函数,比如COUNT(*),怎样通过JDBC调用获得函数值????
  • 调用内核的函数
  • 望指点:系统调用与函数库关系
  • C语言中函数声明与调用问题
  • 博客 iis7站长之家
  • 系统调用对应的内核函数在什么地方
  • 操作系统的系统函数
  • 初学Unix,问:标准级函数,如fopen,fclose;系统级函数open,close,两者什么关系?(在一篇讲文件操作的文章中看到的)
  • 在unix系统中用什么函数可以判别操作系统类型和版本号??
  • Unix系统函数和C语言标准函数库有重叠的部分吗?
  • 高手帮帮忙!vi中如何实现跳转到任意结构体或函数的声明处,包括系统库中声明的函数和数据结构?
  • C库函数和linux系统调用区别
  • Oracle 系统变量函数介绍
  • 如何链接系统库函数?!
  • C语言库函数strtod在不同系统上返回值格式不一致
  • 如何用man查看系统函数的帮助?
  • 系统调用和库函数
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Maps 成员 key_comp():返回比较元素key的函数
  • 请问:定义了2个函数,其中第一个函数要访问另外一个函数的变量,怎么处理阿?谢谢
  • C++ Maps 成员 value_comp():返回比较元素value的函数
  • 如果知道一个函数的地址或函数名,如何得到函数所在的文件名?
  • C++ MultiMaps 成员 key_comp():返回比较key的函数
  • java的数学函数在那个类中,如幂函数、指数、对数、双曲线函数等?
  • C++ MultiMaps 成员 value_comp():返回比较元素value的函数
  • 虚函数被类的构造析构函数和成员函数调用虚函数的执行过程
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • 在dos下访问内存的MK_FP函数在linux下对应什么函数?int86()函数呢?
  • C++ Strings(字符串) 成员 Constructors:构造函数,用于字符串初始化
  • 一个静态库包含多个函数,应用程序连接了库中的某个函数,应用程序目标代码中是否还包含了该静态库中的其他函数代码?
  • linux c 生成随机数srand函数和rand函数介绍及代码示例
  • Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
  • Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间
  • js的众多函数令小弟实在搞不清楚!哪有函数速查手册之类的软件或者书籍!谢了!比如,setInterval、clearInterval这两个函数是干什么的?
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 谁能告诉我,在JAVA中,哪个函数和ASP中的Int()函数等同,也就是取整函数
  • cityhash 32位,64位和128位介绍及函数列表
  • 请教:javascript 里有没有时间循环执行的函数,如我按住鼠标触发mousedown 事件函数时,反复执行我写的一个函数?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3