c语言open()介绍

news/2024/7/3 9:43:46 标签: c/c++, 操作系统, 系统安全

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权限,代表其他用户具有可读、可写及可执行的权限。
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!

转载于:https://www.cnblogs.com/eastnapoleon/p/3309917.html


http://www.niftyadmin.cn/n/1095808.html

相关文章

MYSQL———datetime(0)和datetime不同版本适应问题

项目开发在使用Navicat运行sql、文件时发现错误&#xff08;mysql5.5版本&#xff09; 找了许多文档才发现是datetime函数的问题&#xff0c;当我把datetime(0) 全部改为datetime 语句全部执行成功 原因分析 因为我本地的mysql版本是5.5&#xff0c;该版本是识别不了datetime…

用条件变量实现事件等待器的正确与错误做法

TL;DR 如果你能一眼看出 https://gist.github.com/chenshuo/6430925 中的那 8 个 Waiter classes 哪些是对的哪些是错的&#xff0c;本文就不必看了。 前几天&#xff0c;我发了一条微博 http://weibo.com/1701018393/A7FrW7ZVd &#xff0c;质疑某本书对 Pthreads 条件变量的封…

msys访问windows其他盘

ls /d就可以访问其他盘了 转载于:https://www.cnblogs.com/yan456jie/p/5369442.html

mybatis———一对多关联查询时,只查出一条数据

问题描述 直接执行sql语句时&#xff0c;是查到了所有数据 但在通过接口执行时就变成了一数据 原因 解决 1、设计数据库是&#xff0c;对id命名使用不同字段名例如user_id 、student_id 等&#xff0c;不要统一使用id 2、在sql语句上对查询结果起别名 select id as A_id …

截图与屏幕录像利器:FastStone Capture

博客开始正常更新了&#xff0c;同时也把自己写博客的点滴记录下来&#xff0c;当然也包括写博客用到的好工具~工欲善其事&#xff0c;必先利其器&#xff01; 屏幕录像和截图工具可是真不少&#xff0c;或者有些干脆不需要工具&#xff0c;个人电脑有QQ&#xff0c;办公电脑有…

设计模式——原型模式(Prototype)

用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型创建新的对象。——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程&#xff0c;那么通过原型模式创建对象的过程就是拿着这张纸到复印机上复印的过程。即原型模式中的一个对象可以自…

Python 函数参数问题

Python的传递究竟是值传递还是引用传递&#xff1f; 在回答这个问题之前&#xff0c;需要知道python中的变量只是一个对象的引用。赋值操作不会改变对象指向的内容&#xff0c;而是把变量从一个对象的引用&#xff0c;改为指向另一个对象的引用。对一个变量重新复制后&#xff…

solr4.2 solrconfig.xml配置文件简单介绍

对于solr4.x的每个core有两个很重要的配置文件&#xff1a;solrconfig.xml和schema.xml&#xff0c;下面我们来了解solrconfig.xml配置文件。 具体很详细的内容请细读solrcofig.xml配置文件中的英文说明。 1、 “solr.”--代表solr home&#xff0c;即core所在的目录&#xff0…