您的位置:首页 > 运维架构 > Linux

Linux系统编程笔记

2015-08-31 20:05 453 查看
写在开篇:出于对未来职业规划的考虑(其实还是一团糟),制定了一个基本的学习方向,那就是从系统编程学习API慢慢的深入内核,这是一个比较成熟的学习路线。所以从本篇开始,在这段时间会陆续记录Linux系统编程的学习笔记,除了供学习之余复习只用,同时也期望能记录初入职场摸爬滚打的第一个3年。
第一章 文件I/O 文件访问的基本调用一般是 read()和write(),但是在访问文件之前,要做的是一项很重要的工作就是:打开,没错!通过调用 open()或creat()实现

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

int open(const char *name,int flags)
int open(const char *name,int flags,mode_t mode);
调用成功返回 fd(指向name所指的文件),打开方式根据 flags确定。
flags参数有三种访问模式 O_RDONLY,O_WRONLY,O_RDWR
flags参数还可以与以下参数按位或运算,丰富打开文件的方式
O_APPEND:追加模式打开,指针指向文件末尾 (name指针)

O_ASYNC:对于特殊文件(FIFO、管道、socket、终端),如果可读或可写,会产生信号(默认为SIGIO)

O_CLOEXEC:执行时关闭,在执行新进程时,文件自动关闭,避免竞争。

O_CREAT:name指定文件不存在时,自动创建;如文件存在此位和O_EXCL联合使用,否则无效。

O_DIRECT:打开文件用于直接I/O

O_DIRECTORY:如果参数name不是目录,open()调用失败,该位置位时,其实内部会调用opendir()
DIR* opendir(const char *path)
成功返回fd,失败返回空指针NULL。

O_EXCL:上文O_CREAT()联合使用,如果name参数指定的文件存在则 open()调用失败,防止创建文件时的竞争。

O_LARGEFILE:文件偏移使用64位整数表示,支持大于2G的文件,64位系统默认使用该参数

O_NOATIME+:读文件时不更新最后访问时间,可用于:备份、索引等操作,避免为了更新每个文件的索引节点而导致的大量写操作。

O_NOCTTY:如果给定的name参数指向终端设备,它不会成为这个进程的控制终端。很少用该标志位。

O_NOFOLLOW:如果 name指向一个符号连接,open()会失败。正常情况下,会解析符号连接并打开文件,如果子目录还是链接,open()还是会解析并打开文件。 这种情况可以用到 名人的博客可以用此标志位,即在他博客添加链接是无效的。

O_NONBLOCK:非阻塞模式打开,不管是open()还是其他操作,都不会导致进程在I/O中阻塞(sleep)。只适用于FIFO。

O_SYNC:打开文件用于同步I/O,每次write()之后,数据都会同步到物理磁盘

O_TRUNC:如果文件存在,是普通文件,有写权限,该位置位会把文件长度截断为0。

谈完flags参数,接下来要说的就是mode,就是打开文件的方式(权限),也有以下几个参数:

S_IRWXU:文件所有者读写执行权限

S_IRUSR:文件所有者读权限

S_IWUSR:文件所有者写

S_IXUSR:文件所有者执行

S_IRWXG:组用户有读写执行权限

S_IRGRP:组用户读权限

S_IWGRP:组用户写

S_IXGRP:组用户执行

S_IRWXO:所有人读写执行

S_IROTH:所有人读

S_IWOTH:所有人写

S_IXOTH:所有人执行
写了这么多参数,其实实际上,写入磁盘的权限位由mode参数和用户的文件创建掩码(umask)共同决定。具体是:umask取反后和mode参数按位与。(mode参数的值在Linux权限中:读4,写2,执行1)

creat()函数:由于O_WRONLY|O_CREAT|O_TRUNC组合经常被使用,就有一个专门的系统调用来提供此功能。
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>

int creat (const char *name,mode_t mode)
调用展示:
int fd;

fd=creat(filename,0644);
if(fd==-1) /*error*/
等效于:
int fd;

fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644);
if(fd==-1) /*error*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: