首页 > 其他 > 详细

文件io

时间:2021-03-17 00:19:01      阅读:33      评论:0      收藏:0      [点我收藏+]

文件I/O

文件描述符:所有打开的文件通过文件描述符引用,文件描述符是一个非负整数。当打开或创建一个新文件时,内核向进程返回文件描述符。
1.open函数

int open(const char * 文件名,int oflag, (创建时使用第三个参数))

返回值:成功返回文件描述符,出错返回-1.

打开方式:
OFLAG:
    1.O_RDONLY   只读
    2.O_WRONLY  只写
    3.O_RDWR      读写

上述常量三选一:
下列可选择的:
      O_APPEND  每次写时追加到文件尾端。
      O_TRUNC    如果文件存在将其截短为0。
      O_CREAT     创建文件,使用此时,指定文件权限位。 文件权限位 & umask屏蔽字

2.lseek:每个打开打开的文件偏移量都与其关联的“当前文件偏移量”。通常是一个非负整数。

off_t    lseek(int fileds, off_t offset, int whence )//文件标识符,偏移量, 以哪一种方式

返回值:成功返回新的文件偏移量,若出错返回-1.

int whence:
    SEEK_SET   距离文件偏移量多少
    SEEK_CUR  从当前位置加多少偏移量,可正可负。
    SEEK_END  从文件长度增加偏移量 , 可正可负。

3.read函数:

SSIZE_T (int filedes, void *buf, size_t nbytes) //标识符,缓冲区(可以是堆或栈),读多大字节

返回值:若成功返回读到的字节,读到末尾返回0,失败返回-1.

4.write函数:

SSIZE_T  (int filedes,void *buf,size_t nbytes)//标识符, 缓冲区,  写多少字节。

返回值:成功返回已写的字节数,失败返回-1.

5.close函数:

close(fd);

i/o效率:
1024 - 4096 比较好,4096为最佳。

文件共享:

进程表项:1024个字节,类似于结构体,里面有标记flag,还有指向文件表的指针。(给用户返回的是文件描述符)
文件表项:每打开一个文件就有1个文件表项和对应的V结点表项。(同一个文件打开多次有多个文件表),以打开次数为单位。
结构体成员:
    1.文件打开方式(way)
    2.偏移量(position)(从那里读,从那里写)
    3.指针指向v结点表项
V节点表项:文件的信息。(长度,权限。。。)

原子操作:
    一个函数就能搞定的。
    所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束.

dup和dup2函数:

#include<unistd.h>

int dup(int oldfiledes)//标识符,当前可用最小文件描述符最为oldfd的赋值
返回值:返回当前可用文件描述符中的最小数值,出错返回-1.

int dup2(int oldfd, int newfd);	//如果newfd被占用了,先关掉,让newfd作为oldfd的赋值。dup2能够指定fd给oldfd赋值

返回值:成功返回文件新的描述符,出错返回-1.

fcntl函数:

int fcntl(int fd, int cmd, /* int arg */)文件描述符, 功能描述符, 第三个参数是一个整数,指向结构体的指针。

fcntl函数的5种功能:
    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/cmd = F_SETLK/  cmd = F_SETLKW)
  

文件io

原文:https://www.cnblogs.com/guohaohui/p/14546558.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!