C语言 open函数

来源:互联网 发布:js制作大师下载 编辑:程序博客网 时间:2024/06/06 21:55

功能:打开(可能是创建)文件或设备。

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

            #include<sys/stat.h>

           #include<fcntl.h>

函数原型: int open(const char* pathname,int flags);

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

           intcreat(const char* pathname,mode_t mode);

参数释义: pathname:表示文件路径的字符串。

          flags:对文件的访问标记(access flags)

                  flags必须包含下列三个中的一个O_RDONLY、O_WRONLY、O_RDWR(分别表示只读、只写、读写),此外0个或多个文件创建flags或文件状态flags可以异或到flags中,文件创建flags和文件状态flags的区别是文件状态flags可以通过fcntl()函数来修改,而文件创建flags则不行。下面列出文件创建flags和文件状态flags的列表:

             O_APPEND:追加方式,每次写之前,文件都会定位到末尾。注意:NFS文件系统中,不能同时有好几个进程对同一个文件追加数据,因为NFS文件系统不支持追加方式。

             O_ASYNC:信号驱动输入输出方式,当每次输入或输出准备就绪后,产生一个信号。这种方式仅适用于终端、伪终端、socket、管道、fifo。

             O_CREAT:创建方式,如果pathname所指定的文件不存在,则创建一个新的文件。此新文件的userid是执行此操作的进程user id,此新文件的group id或者是执行此操作的进程的group id,或者是父目录的groupid(由文件系统类型、挂载选项、父目录的mode来决定)。

             O_DIRECT:最小化cache作用的方式。这种方式是系统的cache作用最小发挥,这可能会影响进程的性能,但是对于某些特定场景比较适合(比如,自己完成cache,而不需要系统自动完成)。

             O_DIRECTORY:如果pathname是目录,则open函数失败。这个标记是linux特有的,是为了避免opendir在fifo或tapedevice上调用时的denial of service问题。

              O_EXCL:当和O_CREAT一起使用的时候,若文件已经存在(只要文件的符号链接存在即可,无论这个符号链接指向何处),则open函数执行失败。在NFS文件系统里,O_EXCL遭到破坏。当通过O_EXCL来完成加锁任务时,会存在racecondition问题。通过O_EXCL完成加锁操作的过程是这样的:创建一个唯一的文件,然后通过link()函数与这个文件建立连接,若link()函数返回0,则加锁成功,否则,用在此文件上使用stat()函数,假如这个文件的链接数增大到2,也说明加锁成功。

             O_LARGEFILE:允许打开的文件是大文件(其大小不能用off_t表示,而是用off64_t表示)。

             O_NOATIME:当对文件进行读操作时,不更新文件的最后访问时间。这个标记多用在索引或备份程序中,使用这个标记可以减少磁盘操作次数,进而提高效率。这个操作不是对所有的文件系统都适用,NFS文件系统就不适用,因为NFS文件系统是在服务器端控制最后访问时间。

             O_NOCTTY:如果pathname指向的是终端设备,那么此终端不会成为进程的控制终端(即使此进程没有控制某个终端)。

             O_NOFOLLOW:如果pathname是符号链接,那么open函数执行失败。pathname前部的符号链接还是可以被跟踪的。

             O_NONBLOCK或O_NDELAY:如果一个文件用nonblock方式打开,则无论是open操作,还是其后作用于这个文件上的其他操作,都不会阻塞等待,而后立即返回。

             O_SYNC:同步方式。在对这个文件的写操作完成之前,不能对这个文件进行其他的操作。

             O_TRUNC:如果要打开的文件已经存在,并且是一个普通文件,并且打开方式允许写操作,那么这个文件的长度会被截断成0.对于FIFO和终端,O_TRUNC被忽略。

         在打开文件之后,上面有些flags可以通过调用fcntl()来修改。

         

         mode参数:当一个文件被创建时,mode参数指定这个文件的访问权限。可以通过umask()来改变文件的访问权限,一般情况下,文件的访问权限是mode&~umask。mode可以使用下面的符号常量:

            S_IRWXU (00700) 本用户有读、写、执行的权限。

             S_IRUSR(00400)本用户有读的权限。

            S_IWUSR (00200)  本用户有写的权限。

            S_IXUSR (00100) 本用户有执行的权限。

            S_IRWXG (00070)  本组能成员有读、写、执行的权限。

            S_IRGRP (00040)  本用户组能成员有读的权限。

            S_IWGRP (00020)  本用户组成员有写的权限。

            S_IXGRP (00010)  本用户组的成员有执行的权限。

            S_IRWXO  (00007) 其他用户有读、写、执行的权限。

            S_IROTH  (00004) 其他用户有读的权限。

            S_IWOTH  (00002) 其他用户有写的权限。

            S_IXOTH  (00001)  其他用户有执行的权限。

          flags使用O_CREAT时,必须使用mode参数,其他情况可忽略。

 

           creat()函数等价于将flags设置成O_CREAT|O_WRONLY|O_TRUNC时的open()。

返回值: open()函数和creat()函数执行失败时,都将返回-1,执行成功是将返回文件的描述符。此描述符是一个小的、非负的整数,此描述符是本进程中未使用的数值最小的文件描述符。这个描述符其实是一个表的entry,这个表记录了文件的offset和status,是一个系统级的表。当pathname所指向的文件被删,或者pathname指向其他的文件时,都不会影响这个entry(文件描述符)。

 

             

 

 

原创粉丝点击