系统编程之文件IO(七)——0,1,2三个文件描述符与库函数和系统调用的区别
一、0,1,2三个文件描述符
stderr:终端(无缓冲区)
stdin:键盘
stdout:终端(有缓冲区)
echo hello > /dev/stderr
echo hello > /dev/stdout
文件描述符:
0:stdin
1:stdout
2:stderr
文件指针:stdin:stdin
stdin:stdin
stderr:stderr
stdout:stdout
char buffer[1024];
fgets(buffer, sizeof(buffer) - 1, stdin);
fputs(buffer, stdout);
二、库函数VS系统调用
文件分类
普通文件、目录文件、设备文件、链接文件
|
库函数(标准IO) > 系统调用API(初级IO)
如何选择库函数、系统调用API的方式(区别)?
库函数的读写效率优于系统调用(库函数有缓冲式访问),对文件做大量读写操作(库函数)
举例:
系统调用只能一次一次的访问硬件,而每次访问硬件就像是一次中断,每次中断都需要保存那个时候的状态,所以开销很大,需要避免
而在库函数时,访问硬件后直接将磁盘里的东西全部读到缓存区里,之后,软件直接访问缓冲区,不要再访问硬件了
int fread(void *ptr, size_t size, size_t nmemb, FILE *fp)
{
//read(fd,ptr ,size *nmemb);Linux
//win:read
}
C语言中有一个内置宏,可以区分是WIN还是Linux
库函数可以跨平台,系统调用不可以,依赖于操作平台
操作特殊文件,如:设备文件,只能用系统调用
高级IO,文件映射