前面介绍了linux系统一切皆文件的概念,系统使用一套系统调用函数open()、read()、write()、close()等可以对所有文件执行I/O操作。应用程序发起的I/O请求,内核会将其转化为相应的文件系统操作,或者设备驱动程序操作。接下来我们一起了解一下open()函数。 open()函数可以打开一个已有文件或创建并打开文件,同时返回文件描述符。函数原型如下: pathname指定要打开的文件; flags为打开文件的标志位,控制打开方式; mode为可选参数,用于指定新创建文件的权限模式。 如果指定的文件不存在,则可以通过在flags中指定O_CREAT,然后open()即可创建。flags参数包含的标志及含义如下表,多个标志可用运算符“|”合并到一起。其中标志参数必须包含O_RDONLY、O_WRONLY、O_RDWR中的一种访问方式。 oflag必须指定下面其中一个: 下面是可选选项: 这些常量可分为三组:文件访问模式标记(可以通过fcntl的F_GETFL进行检索)、文件创建标记(不可以通过fcntl的F_GETFL进行检索或修改)、已打开文件的状态标记(可以通过fcntl的F_GETFL和F_SETFL进行检索和修改)若打开文件时发生错误,open()将返回-1,错误号errno标识错误原因,可能参的错误如下: 由open和openat函数返回的文件描述符一定是最小的未用的数值,常量_POSIX_NO_TRUNC决定是否要截断过长的文件名或路径名,还是返回一个错误。 出错时open返回-1,错误号errno标识错误原因: 代码示例: 若未指定O_CREAT标记,则可以省略mode参数,即创建文件,必须指定mode设置权限默认值,但是权限,不仅依赖于mode,还受到进程umask和父目录的默认访问控制列表影响: 代码示例:
|