linux o 文件是什么,linux 文件I/O

1、文件描述符,和标准C不用,其使用数字来表示,需要特殊说明的是。0 标准输入、1 标准输出、2 标准错误输出。

2、open函数,需要说明是其flag,

O_RDONLY:只读打开

O_WRONLY:只写打开

O_RDWR:读、写打开

----------------------------------上面3个是互斥的,只能选一种

0818b9ca8b590ca3270a3433284dd417.png

这几个是或关系,常用的组合O_RDWR | O_CREAT | O_TRUNC

3、I/O效率,时常困扰的一个文件是,当读取一个文件时,已多大的buffer才算最为合理,实验表明,当buffer大小与系统磁盘块大小一致时,其性价比最高,即节省内存,同时节省cpu时间。

4、文件共享,同一个文件可以被多个进程同时打开,并且同时写、读吗,答案是ok的,但是一定要保证原子性。

内核采用三种数据结构表示打开的文件。

(1) 进程表项:文件描述符、描述符标志(close_on_exec,在执行exec时,其描述符是否关闭,默认是不关闭)、指向文件表项的指针;

(2) 文件表:文件状态标志(open操作时所指定的flag)、当前文件偏移量、指向v节点表项指针;

(3) v节点:文件类型、文件操作函数指针、i节点指针;

(4) i节点:所有者、文件长度、文件所在设备、在磁盘实际位置指针等等。

0818b9ca8b590ca3270a3433284dd417.png

那么如果2个进程同时代开一个文件会怎样呢,表项关系如下:

0818b9ca8b590ca3270a3433284dd417.png

注意,每个进程,有自己单独的文件表(文件偏移量,单独的flag)。但是其i节点(文件大小,磁盘位置)确实共享的。如果2个进程都是读操作,ok,没有文件,但是一旦一个写,或者俩同时写,这样文件大小和各自的文件偏移量就会出现不一致的情况,怎么办,则必须保证原子操作。

(1) 同时写、在open时指定O_APPEND标志,这样,在进程写之前,先保证偏移量和 i 节点中文件大小一致;

(2) pread、pwrite,这俩函数和正常的read、write区别在于需要指定offset,执行时相当于执行lseek、再执行read和write、但是俩操作时原子的。

5、dup和dup2操作,两个超神奇的函数,复制文件描述符,其表项关系如下:

0818b9ca8b590ca3270a3433284dd417.png

注意,其文件表项是共享的。当我们fork一个子进程时,同时也是执行一个dup,复制文件描述符。

6、fcntl函数

(1) 复制描述符(cmd=F_DUPFD);

(2) 获得和设置文件描述符标记(cmd=F_GETFD/F_SETFD);

(3) 获得和设置文件状态标志(cmd=F_GETFL/F_SETFL);

(4) 获得和设置异步I/O所有权(cmd=F_GETOWN/F_SETOWN);

(5) 获得和设置记录锁(cmd=F_GETLK/F_SETLK);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值