系统默认定义了标准输入
#define STDIN_FILENO 0
标准输出
#define STDIN_FILENO 1
错误输出
#define STDERR_FILENO 2
在unix系统 打开文件进行操作都需要文件描述符,文件描符简单的说就是身份证ID。
系统维护一个文件表 该文件表里面存放的是 文件描述符 和地址 ,地址指向具体文件操作定义
通过使用文件描述符 可以索引到文件操作
系统默认提供了 0~2的文件描述符
之后的 当我们进行 open,create等操作的时候 自动添加进表
所以int creat(const char * ,mode_t)返回的文件int 就是你所进行操作的文件的唯一身份标示,
然后你只要拿着这个ID 然后告诉系统给我找xx
write(int fd,char *buf,int lenght) 通过fd得到准确文件 然后写入
在OS X系统下测试 文件描述符表 自增,当释放close之后,fd变成-1
如果再继续新建 则填补之前的空缺。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main(void){
int fd;
fd=creat("file.hole", FILE_MODE);
printf("After Create:%d\n",fd);
int fd2=creat("file.hole", S_IREAD);
printf("After Create:%d\n",fd2);
int fd3=dup(fd);
printf("After Dup:%d\n",fd3);
close(fd);
int fd4=dup(fd2);
printf("Delete a fd and Create New:%d\n",fd4);
}
结果如下
After Create:3
After Create:4
After Dup:5
Delete a fd and Create New:3