• UNIX环境高级编程 文件I/O


    大多数文件I/O 只需要用到 5个函数 :    open , read , write , lseek , close 

    本章描述的都是不带缓冲的I/O(read write 都调用内核中的一个系统调用)

    文件描述符 

         对于内核而言,所有文件都通过文件描述符引用。

         文件描述符是一个非负整数

         打开或创建一个新文件时,内核都将返回一个文件描述符

         文件描述符的范围是 0~OPEN_MAX-1

    函数 open 和 openat

         调用 open 或 openat 可以打开或创建一个文件

         int open( const char *path , int oflag , . . . /* mode_t mode */  )

         int  openat( int fd , const char *path , int oflag , . . . /* mode_t mode */

         仅当创建新文件时才使用最后的课表参数。

         oflag参数可以用来说明此函数的多个选项:

              O_RDONLY    只读打开

              O_WRONLY   只写打开

              O_RDWR       读写打开

         open 和 openat 返回的文件描述符,一定是最小的未用描述符数值

         

       

    函数 creat

         调用creat函数创建一个新文件

         int creat ( const char *path , mode_t mode)

         效果等同于 open( path , O_WRONLY | O_CREAT | O_TRUNC , mode )

         creat 以只写方式打开所创建的文件。

    函数 close

         调用此函数关闭一个打开文件。

         int close ( int fd )

    函数 lseek

         每个打开文件都有一个 文件偏移量。 用来度量从文件开始处计算的字节数。

         读,写操作都从当前偏移量开始,并增加所读写的偏移量。

         off_t lseek ( int fd ,off_t offset , int whence) ;

         whence 参数 :

              SEEK_SET          从文件开始处便宜offset个字节

              SEEK_CUR         从文件偏移量设置当前值加offset

              SEEK_END         将偏移量设置为文件长度加偏移量

         

         lseek调用成功后返回新的偏移量 

    函数 read

         从打开的文件中读数据

         ssize_t read( int fd, void *buf, size_t nbytes)

         

         调用成功返回读取到的字节数,达到文件末端返回0。

         

    函数 write

         向打开文件写数据

         ssize_t write ( int fd, void *buf, size_t nbytes)

         返回值通常与 nbytes 相同。

    文件共享

         内核使用 3 种数据结构表示打开文件:

              

              (1) 进程表项

                             1.文件描述符

                             2.指向文件表项的指针

              (2)文件表项

                             1.文件状态标志 ( 比如 读,写,非阻塞等 )

                             2.当前文件偏移量

                             3.指向V节点表项的指针

              (3)V节点表项

                             每个打开文件都有一个V节点结构。

    函数 pread 和 pwrite

         属于原子操作。

         不更新当前文件偏移量

    函数 dup 和 dup2

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

         int dup( int fd )

         int dup2( int fd , int fd2 )

         

         函数返回的新文件描述符与参数fd共享同一个文件表项

         调用 dup(fd) 等同于 fcntl ( fd , F_DUPED , 0 )

         调用 dup2(fd,fd2) 等同于 close(fd2);fcntl(fd,F_DUPED, fd2);

    函数 sync , fsync 和 fdatasync

         将缓冲区的数据写入磁盘

    函数fcntl

         用来改变已打开文件的属性

         int fcntl ( int fd , int cmd , . . . /* int arg */  );

         

         参数cmd :

              复制一个已有的描述符 F_DUPFD 或 F_DUPFD_CLOEXEC

              获取/设置文件描述符   F_GETFD 或 F_SETFD

              获取/设置文件状态标志 F_GETFL 或 F_SETFL

              获取/设置异步I/O所有权 F_GETOWN 或 F_SETOWN

              获取/设置记录锁           F_GETLK       F_SETLK        F_SETLKW

  • 相关阅读:
    Java-对象数组排序
    aoj 0118 Property Distribution
    poj 3009 Curling 2.0
    poj 1979 Red and Black
    AtCoder Regular Contest E
    AtCoder Beginner Contest 102
    AtCoder Beginner Contest 104
    SoundHound Inc. Programming Contest 2018
    poj 3233 Matrix Power Series
    poj 3734 Blocks
  • 原文地址:https://www.cnblogs.com/wchyi/p/5547957.html
Copyright © 2020-2023  润新知