Linux系统编程笔记

写在开篇:出于对未来职业规划的考虑(其实还是一团糟),制定了一个基本的学习方向,那就是从系统编程学习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*/


你可能感兴趣的:(linux,include,职业规划,create,编程学习)