文章目录
前言
本文简单介绍记录一下系统调用和库函数的区别
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是系统调用与库函数
系统调用是在程序中能用类似函数调用方式调用的操作系统服务的集合;库函数(Library function)是将函数封装入库,供用户使用的一种方式。
二、区别与联系
1.区别
系统调用的实现在内核中,属于内核空间,库函数的实现在函数库中,属于用户空间。
2.一些文件操作常使用的系统调用
int open():打开一个文件
int close():关闭一个文件
int write():向文件中写入数据
int read():从文件中读取数据
Linux不分文件是文本文件还是二进制文件
3.调用过程
当执行open函数时,程序产生中断,现场保护,此时把open的系统调用号5写入eax寄存器中,然后从用户态切换到内核态,然后找到5对应的系统调用表,执行以后,把返回的文件描述符3放入eax寄存器中带回,现场恢复,恢复中断,程序从eax中拿到打开文件的描述符,继续向下执行。
三、父子进程共享同一文件
1.文件描述符
2.代码示例
输出:
从结果可以看出,打开一个文件之后执行fork,父子之间可以共享一个文件资源,包括文件的起始偏移量等。
总结
系统调用的主要开销是从用户态切换到内核态的时间,也正是如此printf才会设置缓冲区,很多库函数的底层也封装了系统调用。
先打开文件再fork,此时父子进程拥有同样的struck_file。