文件I/O

1: 文件操作的流程; 打开(open), 读(read) ,写( write ), 设置写/读时的操作偏移量(lseek), 关闭(close)。

2:操纵时的缓冲讨论。


文件描述符 :内核为打开文件所返回的一个“文件句柄”,是一个非负整数。变化范围(0~ OPEN_MAX)

         按照惯例:标准输入的文件描述符 (0)  STDIN_FILENO, 标准输出的文件描述符(1) STDOUT_FILENO  标准出错输出(2)               STDERR_FILENO


   a : 打开(open):


    #incude<fcntl.h>

    int  open( const char *pathname,  int flags, .../*mode_t mode*/)


                 返回值: 成功返回文件描述符, 失败返回-1.

      说明:1)flags

                    O_RDONLY,  O_WRONLY, O_RDWR . 这三个是必须要指定一个且只能指定一个。

                    下面的则是可选择的:

                    O_APPEND

                    O_CREAT:     若此文件不存在,则创建,使用这个参数时需要第三个参数 mode

                                       (文件访问权限位 )。

                    O__TRUNC:  如果此文件存在,且是为写或读写打开的,则将文件截断为0.

                    O_NOCTTY:  如果此路径指的是终端设备,则不将该设备分配做为此进程的控制终端。

                    O_EXCL:       如果同时指定了O_CREAT,而文件已经存在,则出错。

                                        用此可以测试一个文件是否存在。 如果不存在,则 创建之,

                                        这使得测试存在和创建成为一个原子操作。

                   

                    (Single UNIX specifiction / POSIX.1) 同步输入和输出的选项。

                    O_DSYNC :   使每次write等待物理I/O操作的完成,但是如果写操作并不影响读取刚写入 的数据, 则不等待文件属性被更新。

                    O_RSYNC:    使每个以文件描述符做参数的read操作等待,直至任何对文件同一部分进行的为决写操作都完成。

                    O_SYNC :     使每次的write操作都等到物理I/O完成。包括由write操作引起的文件属性更新所需要的I/O.

      b  :创建(creat)

      

         #include<fcntl.h>

       int  creat( const char *pathname, mode_t mode)

                          返回值: 若成功返回为只写打开的描述符,若出错则返回-1

  它等效于: open( pathname, O_WRONLY | O_CREAT | O_TRUNC,  mode);

  creat的不足之处在与它是以只写方式打开所创建的文件。如果要创建一个临时文件(写 读) .

   则要先调用creat close, 然后   open,有了open的选项参数后,可以使用

   open( pathname, O_RDWR | O_CREAT | O_TRUNC, mode).

    

    C: 位移量设置(lseek)

 

       #include<unistd.h>

     off_t lseek( int filedes,  off_t  offset ,  int whence )

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


         1) 若whence 是SEEK_SET , 则将文件的偏移量设置在距文件开始处offset个字节处。

               若whence 是SEEK_CUR,   则将文件的偏移量设置为当前位置加offset, offset可正可负。

               若whence 是SEEK_END,   则将文件的偏移量设置为文件长度加offset , offset 可正可负。

          off_t 是长整形数据。


           若lseek成功执行,则返回新的文件偏移量,为此可以用下列方式确定文件的当前偏移量:

               off_t     currpe;

              currpe = lseek( fd ,  0 ,  SET_CUR);

         2) 通常lseek返回非负数,但是某些设备允许使用负的偏移量。因此在比较返回值的时候,

            不要测试它是否小于0, 而是要和-1做比较来判断它出错了没。

           

    c:读取(read)

    

      #include<unistd.h>

      ssize_t  read( int filedes , void *buf,  size_t nbyte)


                返回值: 若成功,则返回读到的字节数,若到文件结尾,则返回0, 若出错,则返回-1

   d 写 ( write)


      #include<unistd.h>

    ssize_t  write( int filedes , const void *buf, size_t nbyte)

               返回值: 若成功 , 返回已写的字节数。若失败返回-1. 若返回值与nbyte不同也表示出错。

    e:  改变以打开文件性质( fcntl.h)

 

     #include<fcntl.h>

     int fcntl( int filedes , int cmd, .../*int arg */)

                返回值: 若成功,依赖于cmd, 若出错则返回-1


        有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 / F_SETLK / F_SETLKW)


  f: I/O 杂物箱 (ioctl )


       #include<unistd.h>     / * System V */

       #incude<sys/ioctl.h>   /* BSD and Linux */

       #incude<stropts.h>    /* XSI  STREAMS */

      int ioctl ( int filedes , int request , ...)

 

    这几个头文件只是表示ioctl本身所需要的头文件,通常还需要另外设备的专用头文件。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值