Linux高级程序设计——I/O函数——系统调用与库函数
程序员文章站
2024-03-11 20:23:25
...
系统调用与库函数
库函数由两类函数组成
1.不需要调用系统调用
不需要切换到内核空间即可完成函数全部功能,并且将结果反馈给应用程序,如strcpy,bzero等字符串操作函数。
2.需要调用系统调用
需要切换到内核空间,这类函数通过封装系统调用去实现相应功能,如printf,fread等
库函数与系统调用的关系
并不是所有的系统调用都被封装成了库函数,系统提供的很多功能都必须通过系统调用才能实现。
系统调用是需要时间的,程序中频繁使用系统调用会降低程序的运行效率。
当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用的栈和内存环境,然后转入内核态工作。
系统调用结束后,又要切换回用户态,这种环境的切会消耗血多时间。
库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用IO系统的次数,提高了访问效率
应用程序调用printf函数时,函数执行的过程,如下图
总结:
大多是库函数的本质也是系统调用,
只不过库函数有了缓冲区,用于减少系统调用的次数