Linux系统调用函数open

版权声明:欢迎转载,不必客气。 https://blog.csdn.net/CSDN_FengXingwei/article/details/83627723

作用:

  打开和创建文件。

简述:

  open是UNIX系统(包括LINUX、Mac等)的系统调用函数,区别于C语言库函数fopen。

#include<fcntl.h>
int open(constchar*pathname,intflags);
int open(constchar*pathname,intflags,mode_tmode);

返回值:

  成功则返回文件描述符,否则返回-1

  对于open函数来说,第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的POSIX路径名(如/home/user/a.cpp);flags 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于fcntl.h)通过逻辑位或逻辑构成。

O_RDONLY	只读模式
O_WRONLY	只写模式
O_RDWR		读写模式
tips
只读(readonly):又称唯读,表示文档或属性只能读取,不能修改也不能储存。
只写(writeonly):只能向文件中输入,不能查看文件的内容。

  打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:

O_APPEND	每次写操作都写入文件的末尾
O_CREAT		如果指定文件不存在,则创建这个文件
O_EXCL		如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC		如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY	如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK	如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O

  设置为非阻塞模式

(nonblockingmode)

  以下三个常量同样是选用的,它们用于同步输入输出:

O_DSYNC		等待物理I/O结束后再write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNCread	等待所有写入同一区域的写操作完成后再进行
O_SYNC		等待物理I/O结束后再write,包括更新文件属性的I/O

  open返回的文件描述符一定是最小的未被使用的描述符。
  如果 NAME_MAX(文件名最大长度,不包括’\0’)是 14,而我们想在当前目录下创建文件名长度超过 14 字节的文件,早期的 System V 系统(如 SVR2)会截断超出部分,只保留前 14 个字节;而由 BSD 衍生的(BSD-derived)系统会返回错误信息,并且把 errno 置为 ENAMETOOLONG。
  POSIX.1 引入常量 _POSIX_NO_TRUNC 用于决定是否截断长文件名/长路径名。如果_POSIX_NO_TRUNC 设定为禁止截断,并且路径名长度超过 PATH_MAX(包括 ‘\0’),或者组成路径名的任意文件名长度超过 NAME_MAX,则返回错误信息,并且把 errno 置为 ENAMETOOLONG。


相关函数

read,write,fcntl,close,link,stat,umask,unlink,fopen

头文件

#include <sys/types.h>    
#include <sys/stat.h>    
#include <fcntl.h>

定义函数

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

函数说明

参数 pathname

  指向欲打开的文件路径字符串.

参数flags 所能使用的标志位

O_RDONLY	以只读方式打开文件
O_WRONLY	以只写方式打开文件
O_RDWR		以可读写方式打开文件

  上述三种标志位是互斥的, 也就是不可同时使用, 但可与下列的标志位利用OR(|)运算符组合.

O_CREAT 	若欲打开的文件不存在则自动建立该文件.
O_EXCL 		如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
O_NOCTTY	如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
O_TRUNC 	若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.
O_APPEND 	当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
O_NONBLOCK 	以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
O_NDELAY 	同O_NONBLOCK.
O_SYNC 		以同步的方式打开文件.
O_NOFOLLOW 	如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。注:此为Linux2. 2 以后特有的旗标, 以避免一些系统安全问题. 

参数 mode 组合

  参数 mode 有下列数种组合, 只有在建立新文件时才会生效, 此外真正建文件时的权限会受到umask 值所影响, 因此该文件权限应该为 (mode-umaks).

S_IRWXU		00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
S_IRUSR 或S_IREAD	 00400 权限, 代表该文件所有者具有可读取的权限.
S_IWUSR 或S_IWRITE	 00200 权限, 代表该文件所有者具有可写入的权限.
S_IXUSR 或S_IEXEC	 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 权限, 代表其他用户具有可执行的权限.

返回值

  若所有欲核查的权限都通过了检查则返回文件描述符,表示成功,只要有一个权限被禁止则返回-1。

错误代码

EEXIST 		参数pathname 所指的文件已存在, 却使用了O_CREAT 和O_EXCL 旗标.
EACCESS 	参数pathname 所指的文件不符合所要求测试的权限.
EROFS 		欲测试写入权限的文件存在于只读文件系统内.
EFAULT 		参数pathname 指针超出可存取内存空间.
EINVAL 		参数mode 不正确.
ENAMETOOLONG 	参数 pathname 太长.
ENOTDIR 	参数pathname 不是目录.
ENOMEM 		核心内存不足.
ELOOP 		参数pathname 有过多符号连接问题.
EIO I/O 	存取错误.

附加说明

  使用 access()作用户认证方面的判断要特别小心, 例如在access()后再作open()空文件可能会造成系统安全上的问题.

范例

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
    int fd, size;
    char s[] = "Linux Programmer!\n", buffer[80];
    fd = open("/tmp/temp", O_WRONLY|O_CREAT);
    write(fd, s, sizeof(s));
    close(fd);
    fd = open("/tmp/temp", O_RDONLY);
    size = read(fd, buffer, sizeof(buffer));
    close(fd);
    printf("%s", buffer);
}

猜你喜欢

转载自blog.csdn.net/CSDN_FengXingwei/article/details/83627723