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

1、系统调用

系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h 。以write为例:其函数原型为 size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文 件描述符或文件句柄fd(file descriptor),要想写一个文件,必须先以可写权限用open系统调用打开一个文 件,获得所打开文件的fd,例如 fd=open(\"/dev/video\", O_RDWR)。fd是一个整型值,每新打开一 个文件,所获得的fd为当前最大fd加1。Linux系统默认分配了3个文件描述符值:0-standard input,1- standard output,2-standard error。

系统调用通常用于底层文件访问(low-level file access) ,例如在驱动程序中对设备文件的直接访问。

系统调用是操作系统相关的,因此一般没有跨操作系统 的可移植性。

系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行 文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因 为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用 。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系 统调用来实现的。

这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这是 因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这 时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文 件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者 写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓 冲区内容写到文件对应的硬件媒介。

时间: 2024-10-22 10:18:46

linux系统调用和库函数调用的区别的相关文章

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

从程序完成的功能来看,函数库提供的函数通常是不需要操作系统的服务,函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的.系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等. 函数库的函数,尤其与输入输出相关的函数,大多必须通过Linux的系统调用来完成.因此我们可以将函数库的函数当成应用程序设计人员与系统调用程序之间的一个中间层,通过这个中间层,我们可以用一致的接口来安全的调用系统调用.这样程序员可以只要写一次代码就能够在不

linux 系统调用与标准库调用的区别详细解析_unix linux

1.系统调用和库函数的关系 系统调用通过软中断int 0x80从用户态进入内核态. 函数库中的某些函数调用了系统调用. 函数库中的函数可以没有调用系统调用,也可以调用多个系统调用. 编程人员可以通过函数库调用系统调用. 高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介. 如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库.因为函数库中的函数是内核访问不到的.  2.从用户调用库函数到系统调用执行的流程. 1) 假设用户调用ssize_t wr

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API

【Linux系统编程】 Linux系统调用概述

系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件.关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等. 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口--它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间. 系统服务之所以需要通过系统调

《UNIX环境高级编程(第3版)》——1.11 系统调用和库函数

1.11 系统调用和库函数 所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务.各种版本的UNIX实现都提供良好定义.数量有限.直接进入内核的入口点,这些入口点被称为系统调用(system call,见图1-1).Research UNIX系统第7版提供了约50个系统调用,4.4BSD提供了约110个系统调用,而SVR4则提供了约120个系统调用.具体数字在不同操作系统版本中会不同,新近的大多数系统大大增加了支持的系统调用的个数.Linux 3.2.0提供了380个系统调用,FreeB

Linux中线程和进程的区别

Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘空间.I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来. 线程是进程的一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器.一组寄存器和栈),但

关于系统调用,库函数,SHELL的转摘,,,

这之间的关系,没有成型的梳理过,, 但这个都将所有东东比较系统的讲出了概要..如同打通关节般畅快,特别是SHELL和系统调用的关系...让我们在日常计算机操作中,不会迷失自己的方向.... 哈哈,这同学写的技术博都短小,易懂,我马上就可以全部看完啦...(三个系列:PYTHON,LINUX,TCP/IP) ~~~~~~~~~~~~~~~ http://www.cnblogs.com/vamei/archive/2012/09/19/2692452.html ....... 还记得我们在Linux

三种方法实现Linux系统调用_Linux

系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数.下面介绍Linux 下三种发生系统调用的方法: 一.通过 glibc 提供的库函数glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库.glibc 为程序员提供丰富的 API(Application Programming Interfa

网络常用的linux系统调用

网络之常用的Linux系统调用   下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上"*"号以示区别. 一.进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取