Linux C中库函数与系统调用的区别详细解析

所属分类: 操作系统 / unix linux 阅读数: 135
收藏 0 赞 0 分享

从程序完成的功能来看,函数库提供的函数通常是不需要操作系统的服务,函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的。系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。

函数库的函数,尤其与输入输出相关的函数,大多必须通过Linux的系统调用来完成。因此我们可以将函数库的函数当成应用程序设计人员与系统调用程序之间的一个中间层,通过这个中间层,我们可以用一致的接口来安全的调用系统调用。这样程序员可以只要写一次代码就能够在不同版本的linux系统间使用积压种具体实现完全不同的系统调用。至于如何实现对不同的系统调用的兼容性问题,那是函数库开发者所关心的问题。

从程序执行效率来看,系统调用的执行效率大多要比函数高,尤其是处理输入输出的函数。当处理的数据量比较小时,函数库的函数执行效率可能比较好,因为函数库的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高,但是在进行系统调用时,因为用户进程从用户模式进入系统核心模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。但是当要处理的数据量比较大时,例如当输入输出的数据量超过文件系统定义的尽寸时,利用系统调用可获得较高的效率。

从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库(ANSI C) 具备较高的可移植性,在不同的系统环境下,只要做很少的修改,通常情况是不需要修改的。

Linux C中库函数和系统调用的区别
库函数是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准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!” 的信息

更多精彩内容其他人还在看

Linux通过命令仅获取IP地址的方法

这篇文章主要介绍了Linux通过命令仅获取IP地址的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux 下VSFTP服务搭建过程

这篇文章主要介绍了Linux 下VSFTP服务搭建,需要的朋友可以参考下
收藏 0 赞 0 分享

CentOS 7.0关闭默认防火墙启用iptables防火墙的设置方法

这篇文章主要介绍了CentOS 7.0关闭默认防火墙启用iptables防火墙的设置方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux系统下解决getch()输入数值不回显示问题

这篇文章主要介绍了Linux系统下解决getch()输入数值不回显示问题,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

监控Linux系统节点和服务性能的方法

这篇文章主要介绍了监控Linux系统节点和服务性能的方法,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux下scp无密码上传 下载 文件 目录的方法

这篇文章主要介绍了Linux下scp无密码上传 下载 文件 目录的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

简述Linux文本处理命令“sed”

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。下面通过本文给大家简单介绍Linux文本处理命令“sed”,需要的朋友参考下吧
收藏 0 赞 0 分享

Linux简易彩色进度条的实例代码

#进度条:顾名思义就是看计算机处理任务时的速度,完成度。下面通过本文给大家分享Linux简易彩色进度条的实例代码,需要的朋友参考下吧
收藏 0 赞 0 分享

详解shell中source、sh、bash、./执行脚本的区别

这篇文章主要介绍了shell中source、sh、bash、./执行脚本的区别,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Linux实现U盘自动挂载(图文教程)

这篇文章主要介绍了Linux实现U盘自动挂载功能,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多