上一篇文章讲了Linux 7种文件类型,那么内核如何区分并且使用这些文件呢?答案是通过“文件描述符”。
什么是文件描述符?文件描述符其实质是一个数字,而且是一个非负整数。当打开open或者创建create一个新文件时,内核都会给打开的文件返回一个文件描述符fd。这个文件描述符fd和实际的设备是相对应的,以后就可以通过读写等函数(read write)来操作这个文件描述符进而达到操作设备的目的。
可以通过man 2 xxx命令来查看这些基本函数的原型,如下所示:
int open(constchar*pathname,intflags);复制代码int open(constchar*pathname,intflags,mode_tmode); int create(const char *parhname,mode_t mode); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); off_t lseek(int fd, off_t offset, int whence);
open create函数的返回值就是打开或者创建设备文件的文件描述符。read write lseek等函数的第一个参数fd(file description)就是我们要操作的文件描述符,也就是open create的返回值。因此理解了文件描述符对后面的编程至关重要。
文件描述符需要注意的地方
文件描述符0、1和2. 这3个文件描述符比较特殊,在系统已经固定了。文件描述符0作为标准输入实际上是对应人机交互键盘设备 文件描述符1作为标准输出实际上是对应人机交互设备显示屏。 文件描述符2作为标准出错实际上是计算机将运算的错误信息显示到显示器上。如果我们将标准输出关闭,那么使用printf将无法把信息输出。这3个文件描述符可以用分别用宏来直观表示STDIN_FILENO、STDOUT_FILENO和STDERR_FILE以提高可读性。这些常量是在头文件<unistd.h>。
后续继续更新...