文件I/O需要注意的几点...

来源:互联网 发布:淘宝店铺模板图片 编辑:程序博客网 时间:2024/04/28 09:36
 本来打算从最基本的地方开始讲文件I/O,但是写了一点之后发现自己说的好像都是一些人尽皆知的东西,觉得没有多大的意义,并且浪费口舌,所以,我想写一些大家可能经常忽视的问题,和一些有关文件I/O的一些疑点。好了,废话少说!

       首先说说open函数不经常用到,但是又比较重要的一些标志:

     o_nonblock:以非阻塞的方式打开文件,当我们对一些比较特殊的文件(fifo,块设备文件,字符特殊文件)进行I/O操作的时候,最好使用这个标志,因为在对这类文件进行I/O操作的时候,属于慢速的系统调用,这类系统调用会使调用进程阻塞于此,如果不希望你的程序执行到这里而停住,那么就请使用这个标志吧!

       o_trunc:当是以写或读写的方式打开文件时,会截断文件。

       o_excl:这个标志一般用在创建文件的时候,当同时指定o_creat时,首先会判断文件是否存在,如果存在,则此次调用就会返回出错,否则就会创建此文件。

       o_noctty:如果打开的文件是与一个终端相关联的,如果指定此标志,则此终端不会成为调用进行的控制终端。

       o_sync和o_dsync:这个两个标志其实功能都是一样的,就是当一个文件进行了I/O操作了之后是否同步的更新文件的属性,不过两者肯定还是有不同的地方的,o_sync是进行I/O操作立即的更新文件的属性,o_dsync是只有在需要使用文件的属性的时候才会更新文件的属性!

       使用creat可以创建一个新的文件,不过使用creat创建一个文件的时候是有一个缺陷的,当调用creat成功后返回的是以写打开的文件描述符,也就是说当你想在调用creat后希望去读这个文件,你需要调用close关闭这个文件,然后再调用open以读写的方式打开这个文件,oh My lady gaga! 没有人应该愿意这样吧!并且如果这个时候又有另一个进程也调用creat去创建一个同样的文件,此时又会引发一些其他的问题,这个就不作过多的说明,要不然又要扯到很远了。所以,现在如果希望去创建一个新文件,调用open就足矣!

       下面我想谈谈dup和dup2这么两个函数,我觉得这个函数还是蛮有用的。这两个函数就是文件描述符的复制函数,当如果你希望去复制一个已经打开的文件描述符,那么dup和dup2就可以让你如愿了,下面是这两个函数的原型。

        int dup(int filedes);//成功返回一个新的文件描述符,失败返回-1

     使用fcntl也可以实现相同的功能:

     int fcntl(int filedes,F_DUPFD,0);

     当然你也可以调用dup2使用指定的文件描述符进行复制:

        int dup2(int filedes,int filedes2);//成功返回filedes2,失败返回-1

        当然这里会存在这个一个问题,filedes2已经打开了,那样又会怎么样呢?首先会关闭filedes2,然后再进行复制嘛!

     当然也可以使用fcntl使用相同的功能:

        #include <fcntl.h>

     int fcntl(int filedes,F_DUPFD,int filedes2);

        这样复制出来的文件描述符是共用一个文件表项的,也就是,使用相同的文件状态标志,相同的文件的偏移量!为什么说他们比较有用呢?因为,可以通过调用dup2这个函数改变一个进程的标准输入或标准输出。具体的实现就请读者慢慢的实现去吧!

        眼睛开始痛了,今天就写到这里吧!

                                                                  continue...