二、Linux--文件IO、文件和目录

    xiaoxiao2021-12-14  16

    文件描述符本质上非负整数

    1.open

    头文件:

    #include<sys/types.h>

    #include<sys/stat.h>

    #include<fcntl.h>

    定义函数:

    Int open(const char  *pathname,  int  flags);

    Int open(const char  *pathname,  int  flags,  mode_t   mode);

    函数说明:

    open返回的文件描述符一定是最小的未被使用的描述符。

    mode如果文件不存在,是新建的,则可以利用mode设置文件权限。

    pathname 指向欲打开的文件路径字符串。

    flag 标志位:

    下列是参数flags 所能使用的标志位:

    O_RDONLY以只读方式打开文件

    O_WRONLY以只写方式打开文件

    O_RDWR以可读写方式打开文件。

    上述三种标志位是互斥的,也就是不可同时使用,但可与下列的标志位利用OR(|)运算符组合。

    O_APPEND      每次写操作都写入文件的末尾

    O_CREAT 如果指定文件不存在,则创建这个文件

    O_EXCL 如果要创建的文件已存在,则返回-1,并且修改errno的值

    O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)

    O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。

    O_NONBLOCK 如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O设置 为非阻塞模式

    O_CREAT  若欲打开的文件不存在则自动建立该文件。

    O_EXCL   如果O_CREAT也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREATO_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。

    O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。

    O_TRUNC 若文件存在并且以可写的方式打开时,此标志位会令文件长度清为0,而原来存于该文件的资料也会消失。

    O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。

    O_NONBLOCK以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。

    O_NDELAYO_NONBLOCK

    O_SYNC以同步的方式打开文件。

    O_NOFOLLOW如果参数pathname所指的文件为一符号连接,则会令打开文件失败。

    O_DIRECTORY如果参数pathname所指的文件并非为一目录,则会令打开文件失败。

     

    1.Read

    定义函数

    ssize_t read (int fd,   void *buf,   size_t  count);

    返回值

    成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0

    参数

    参数fd是文件描述符。

    参数count是请求读取的字节数,

    读上来的数据保存在缓冲区buf中,

    同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。

    read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0

    2.Write

    write函数所在的头文件为 <unistd.h>

    ssize_t  write (int handle,  void *buf,  int  nbyte);

    handle 是文件描述符;

    buf    是指定的缓冲区,即指针,指向一段内存单元;

    nbyte  是要写入文件指定的字节数;返回值:返回写入文档的字节数(成功);返回-1(出    错)

    Write  函数把bufnbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.

    3.lseek

    头文件#include <sys/types.h>

     #include <unistd.h>

     off_t   lseek (int  handle,  off_t  offset,  int  fromwhere);

    参数fildes 为已打开的文件描述符,参数offset 为根据参数whence来移动读写位置的位移数。

    whence为下列其中一种:SEEK_SET,SEEK_CURSEEK_END和依次为012.

    SEEK_SET 将读写位置指向文件头后再增加offset个位移量。

    SEEK_CUR 以目前的读写位置往后增加offset个位移量。

    SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

    whence 值为SEEK_CUR SEEK_END时,参数offet允许负值的出现。

     

    每个打开的文件都有一个与其相关连的“当前文件偏移量”( current file offset )。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量开始,并使偏移量增加所读写的字节数。按系统默认情况,当打开一个文件时,除非指定 O_APPEND 选项,否则该偏移量设置为 0

    lseek调用仅将当前的文件偏移量记录在内核中,它并不引起任何的 I/O 操作。然后,该偏移量用于下一个读或写操作。

    4.lstat()

     #include <sys/stat.h>

    函数名: lstat

     : 获取一些文件相关的信息

     : int  lstat (const char *path ,  struct stat *buf);

    参数:

    path:文件路径名。

    buf:是以下结构体的指针

    struct stat {

    dev_t st_dev; /* 文件所在设备的标识 */

    ino_t st_ino; /* 文件结点号 */

    mode_t st_mode; /* 文件保护模式 */

    nlink_t st_nlink; /* 硬连接数 */

    uid_t st_uid; /* 文件用户标识 */

    gid_t st_gid; /* 文件用户组标识 */

    dev_t st_rdev; /* 文件所表示的特殊设备文件的设备标识 */

    off_t st_size; /* 总大小,字节为单位 */

    blksize_t st_blksize; /* 文件系统的块大小 */

    blkcnt_t st_blocks; /* 分配给文件的块的数量,512字节为单元 */

    time_t st_atime; /* 最后访问时间 */

    time_t st_mtime; /* 最后修改时间 */

    time_t st_ctime; /* 最后状态改变时间 */

    };

    返回说明编辑

    成功执行时,返回0。失败返回-1errno被设为以下的某个值

    EBADF: 文件描述词无效

    EFAULT: 地址空间不可访问

    ELOOP: 遍历路径时遇到太多的符号连接

    ENAMETOOLONG:文件路径名太长

    ENOENT:路径名的部分组件不存在,或路径名是空字串

    ENOMEM:内存不足

    ENOTDIR:路径名的部分组件不是目录

     

    6.dup2()

    #include<unistd.h>

    Int dup2(int  old_fd ,int  new_fd);

    功能:

    复制一个现有的文件描述符。

    如果new_fd已经打开,则先将其关闭,若new_fd = old_fd,dup2返回new_fd而不将其关闭。否则,new_fdFD_CLOSEEXEC文件描述符标志就被清除,调用exec时是打开状态。

    7.creat

    #include<fcntl.h>

    int creat(const char *filename, mode_t mode)

    filename要创建的文件名(包含路径,缺省为当前路径)

    mode创建模式

    常见创建模式:(也可以用数字代替以下宏)

    S_IRUSR   可读                   ->1

    S_IWUSR 可写  ->2

    S_IXUSR 可执行 ->4

    S_IRWXU 可读、可写、可执行  ->7

    无任何权限     ->0

    创建成功则返回一个文件描述符,否则返回一个小于0的数

    eg:

    fd=creat(file,777);

    8.access

    #include <stdio.h> #include <unistd.h>

    int access(const char * pathname,int mode)

    功能:

    判断文件可以操作的权限

    pathname:需要检测的文件路劲名

    mode:需要测试的权限模式

    R_OK  可读

    W_OK 可写

    X_OK 可执行

        返回值:

    测试成功,满足操作权限返回0,否则返回-1

    转载请注明原文地址: https://ju.6miu.com/read-968959.html

    最新回复(0)