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

开放(系统调用提供),返回值新文件描述符(fd), 1,误差


写入文件(有缓冲区):由C语言提供缓冲区,默认为行缓冲,遇到换行符就刷新,但是当重定向到文件时,变成全缓冲,就不刷新,直到缓冲区写满.fork前:暂存在于父进程缓冲区中不刷新,叉后:父进程复制到子进程,此时将缓冲区也复制过去。当进程终止时再刷新缓冲区

写(无缓冲区)

,

<人力资源/>

1。系统调用

,,,系统调用提供的函数如打开、关闭、读、写,ioctl等,需包含头文件unistd。h。以写为例:其函数原型为size_t写(int fd, const void * buf size_t nbytes),其操作对象为文件描述符或文件句柄fd(文件描述符),要想写一个文件,必须先以可写权限用开放的系统调用打开一个文件,获得所打开文件的fd,例如fd=开放(//dev/视频/,O_RDWR) .fd是一个整型值,每新打开一个文件,所获得的fd为当前最大fd加1. linux系统默认分配了3个文件描述符值:0 -标准输入、标准输出,2标准错误。系统调用通常用于底层文件访问(低级文件访问),例如在驱动程序中对设备文件的直接访问。

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

2。库函数调用

标准C库函数提供的文件操作函数如打开外部文件,从文件中读,写入文件,文件关闭,。fflush, fseek等,需包含头文件的头。h。以写入文件为例,其函数原型为size_t写入文件(const void *缓冲区,size_t大小,size_t item_num,文件* pf),其操作对象为文件指针文件* pf,要想写一个文件,必须先以可写权限用fopen函数打开一个文件,获得所打开文件的文件结构指针pf,例如pf=fopen(/~/项目/文件名/,/w/)。实际上,由于库函数对文件的操作最终是通过系统调用实现的,因此,每打开一个文件所获得的文件结构指针都有一个内核空间的文件描述符fd与之对应同。样有相应的预定义的文件指针:stdin-standard输入,stdout-standard输出,stderr-standard错误。库函数调用通常用于应用程序中对一般文件的访问。由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序中对设备的操作。

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