c语⾔open()介绍
2013-09-0914:40:13 1. 头⽂件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
2. 定义函数:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
3. 函数说明:
3.1 参数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以后特有的旗标,以避免⼀些系统安全问题。
3.2 参数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权限,代表其他⽤户具有可读、可写及可执⾏的权限。
c++trunc函数S_IROTH 00004权限,代表其他⽤户具有可读的权限。
S_IWOTH 00002权限,代表其他⽤户具有可写⼊的权限。
S_IXOTH 00001权限,代表其他⽤户具有可执⾏的权限。
3.3 返回值:若所有欲核查的权限都通过了检查则返回0,表⽰成功,只要有⼀个权限被禁⽌则返回-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()空⽂件可能会造成系统安全上的问题。
4. 范例:
#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);
}
执⾏:
Linux Programmer!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。