文件描述符

非负整数, 默认使用最小的可用的整数 0,1,2 对应 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO

读写函数

#include<unistd.h>

进程文件结构

![image.png](https://upload-images.jianshu.io/upload_images/7130568-41de9a42f1c26214.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![image.png](https://upload-images.jianshu.io/upload_images/7130568-88491773353c7aa6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

文件共享

![image.png](https://upload-images.jianshu.io/upload_images/7130568-bb62bdea0df113e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) # 原子操作
一般有多个函数的操作,, 不是原子操作, 多进程运行时可能出错,比如
```
seek pointer  to end
write
```
单进程没有问题, 而多进程访问同一个文件, 而不是同一个文件描述符时, 比如a,b访问f
当a执行完seek到end后 ,写指针在n, b执行seek to end 然后写至x bytes,此时文件指针已经到n+x,  但是a会在n处继续执行写,然后就覆盖了bxx的内容

复制文件描述符dup dup2

``` #include<unistd.h>
int dup(int fd); // copy fd
int dup2(int fd,int fd2)
// close fd2 and open fd,  note it's  an atomic op
//if  fd2==fd : return fd2
```
![image.png](https://upload-images.jianshu.io/upload_images/7130568-5a24c92f20e687e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


参考资料: UNIX环境高级编程 W.Richard Stevens, Stephen A. Rago