《UNIX环境高级编程》读书笔记 —— 文件 I/O

一、打开或创建一个文件

#include <fcntl.h>

int open(const char *pathname, int oflag, .../*mode_t mode*/);

返回值:若成功则返回文件描述符,若出错则返回-1

oflag选项:

O_RDONLY

O_WRONLY

O_RDWR

以上三个常量中必须指定一个,且只能指定一个。

以下常量都是可选的:

O_APPED     每次写时追加到文件尾

O_CREAT     若文件不存在,则创建

O_EXCL      若同时指定了O_CREAT,而文件已经存在,则出错;否则创建文件

O_TRUNC     若文件存在且为只写或读写打开成功,则讲文件截断为0

O_NOCTTY

O_NONBLOCK  若pathname指定的是一个FIFO、一个快特殊文件或者一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非组赛模式。

O_DSYNC     每次write都等待物理I/O完成,但不等待文件属性更新

O_RSYNC

O_SYNC      每次write都等待物理I/O完成,包括write引起的文件属性更新所需的I/O

#include <fcntl.h>

int create(const char *pathname, mode_t mode);

返回值:若成功则返回为只写打开的文件描述符,若出错则返回-1

该函数等效于:

open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)

二、关闭一个打开的文件

#include <unistd.h>

int close(int filedes);

返回值:若成功则返回0,若出错则返回-1

关闭一个文件时还会释放该进程在该文件上的所有加锁。

当一个进程结束时,内核会自动关闭它所有打开的文件。

三、为一个打开的文件设置偏移量

#include <fcntl.h>

off_t lseek(int filedes, off_t offset, int whence);

返回值:若成功则返回新的文件偏移量,若出错则返回-1

whence取值:

SEEK_SET    将文件偏移设置为距文件开始处offset个字节

SEEK_CUR    将文件偏移设置为当前值加offset,offset可为正或负

SEEK_END    将文件偏移设置为文件长度加offset,offset可为正或负

管道、FIFO和网络套接字不可设置偏移量

四、文件读写

#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:若成功则返回读到的字节数,若已到文件尾则返回0,若出错则返回-1

#include <unistd.h>

ssize_t write(int filedes, void *buf, size_t nbytes);

返回值:若成功则返回已写的字节数,若出错则返回-1

五、文件共享

六、复制文件描述符

#include <unistd.h>

int dup(int filedes);

int dup2(int filedes, filedes2);

返回值:若成功返回新的文件描述符,若失败返回-1

dup返回的是当前可用的最小的文件描述符

dup2则返回filedes2所指定的文件描述符,若filedes2已经存在,则先将其关闭

七、文件同步

#include <unistd.h>

int fsync(int filedes);

int fdatasync(int filedes);

void sync();

sync    该函数只是将所有修改过的块缓存加入写队列,并不等真正的写磁盘结束就返回,系统update守护进程会定期(30秒)调用该函数

fsync   只针对filedes描述符起作用,并且等待写磁盘操作结束然后返回

fdatasync   类似于fsync,但它只影响文件的数据部分,不同步更新文件属性

#include <fcntl.h>

int fcntl(int filedes, int cmd, .../* arg */);

返回值:若成功则依赖于cmd,若失败则返回-1

八、文件控制

fcntl的5种功能:

复制一个现有的描述符  cmd = F_DUPFD

获得/设置文件描述符标记    cmd = F_GETFD / F_SETFD

目前只有一个标志:FD_CLOEXEC

获得/设置文件状态标记 cmd = F_GETFL / F_SETFL

文件状态标志:O_RDONLY  只读打开

O_WRONLY  只写打开

O_RDWR    读写打开

O_APPEND  *每次写时追加

O_NONBLOCK    *非阻塞模式

O_SYNC    *等待写完成(数据和属性)

O_DSYNC   *等待写完成(仅数据)

O_RSYNC   *同步读、写

O_FSYNC   *

O_ASYNC   *

加*号的为F_SETFL所能修改的

获得/设置异步I/O所有权   cmd = F_GETOWN / F_SETOWN

获得/设置记录锁    cmd = F_GETLK / F_SETLK / F_SETLKW

#include <unistd.h>

int ioctl(int filedes, int request, ...);

返回值:若出错返回-1,成功返回其他返回值

《UNIX环境高级编程》读书笔记 —— 文件 I/O

时间: 2024-12-20 18:32:22

《UNIX环境高级编程》读书笔记 —— 文件 I/O的相关文章

UNIX环境高级编程学习笔记(第一章UNIX基础知识)

总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时候使用的平台是Windows+VMware+debian,使用secureCRT来连接(可以实现多个终端连接). 因为第一章是本书大概的描述,所以第一章的我打算写得详细一点,而且书本的原话占的比例会比较多,重点的东西会用粗体显示出来. 1.1  引言 所有操作系统都为他们所运行的程序提供服务.典型的

《UNIX环境高级编程》笔记——3.文件IO

一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进程共享资源(包括文件)时,会有很多额外的烦恼,需要对共享资源.原子操作等概念深入理解,需要理解涉及的内核有关数据结构,这些数据结构对理解文件.共享有重要作用: 最后介绍dup.fcntl.sync.fsync和ioctl函数. 二.文件描述符 open或creat文件时,内核--文件描述符fd-->

Unix环境高级编程学习笔记(三):标准I/O , 系统数据文件和信息

1 标准I/O函数不同于read,write函数,是其在流上进行操作, 当首次调用标准I/O函数时,系统会首先调用malloc,为流创造缓冲区, 2 fopen函数 #include<stdio.h> file * fopen(const char* pathname, const char * restrict name); 打开返回指针,出错返回NULL, type的取指有r(读),w(写),a(追加),r+/w+(读+写),a+(读+写+追加) int fclose(file* fp)

《UNIX环境高级编程》---3.文件I/O

一.打开.创建文件.关闭文件 文件描述符:一个非负整数,范围是0~OPEN_MAX-1.内核用它来标识进程正在访问的文件.当进程创建时,默认为它打开了3个文件描述符,它们都链接向终端: 0: 标准输入 1: 标准输出 2: 标准错误输出 通常我们应该使用STDIN_FILENO,STDOUT_FILENO和 STDERR_FILENO来替代这三个幻数,从而提高可读性.这三个常量位于<unistd.h>中. 2. open和openat函数:打开文件 ``` #include<fcntl.

《UNIX环境高级编程》---4文件和目录

文件和目录 一. stat 结构和权限相关 四个stat函数:返回文件或者目录的信息结构: #include<sys/stat.h> int stat(const char * restrict pathname, struct stat*restrict buf); int fstat(int fd, struct stat* buf); int lstat(const char* restrict pathname,struct stat *restrict buf); int fstat

Unix环境高级编程学习笔记(五):进程控制

1 getpid函数,getppid函数,得到进程id,得到父进程id #include<unistd.h> pid_t getpid(void) pid_t getppid(void) uid_t getuid(void)得到实际用户id uid_t geteuid(void)得到有效用户id gid_t getgid(void)得到实际组id gid_t getegid(void)得到有效组id 2 fork函数,当前进程创建新进程 #include<unistd.h> pid

Unix环境高级编程学习笔记(七):线程

1 线程包含线程ID,一组寄存器的值,栈,调度优先级和策略,信号屏蔽字,errno变量,以及线程私有数据.进程的所有信息对于该进程的所有线程都是共享的,包括可执行程序文本,程序全局内存和堆内存,栈以及文件描述符. 线程可以通过pthread_self函数获得自身线程ID #include<pthread.h> pthread_t pthread_self(void) 新增进程可以通过pthread_create函数创建 #include <pthread.h> int pthrea

Unix环境高级编程学习笔记(四):进程环境

1 exit函数与_Exit函数 #include<stdlib.h> void exit(int status) void _Exit(int status) 这两个函数的不同之处在于exit函数先执行清理工作后再进入内核(清理I/O缓冲),_Exit函数直接进入内核 2 atexit函数,登记函数,在exit的时候执行 int atexit(void (* func) (void)); 被登记的函数称为终止处理函数,这些函数的调用顺序与登记顺序相反,如果一个函数被登记多次,也会被调用多次

UNIX环境高级编程(阅读笔记)---多线程信号

多线程信号 1.默认情况下,信号将由主进程接收处理,就算信号处理函数是由子线程注册的 2. 每个线程均有自己的信号屏蔽字,可以使用sigprocmask函数来屏蔽某个线程对该信号的响应处理,仅留下需要处理该信号的线程来处理指定的信号. 3. 对某个信号处理函数,以程序执行时最后一次注册的处理函数为准,即在所有的线程里,同一个信号在任何线程里对该信号的处理一定相同 4. 可以使用pthread_kill对指定的线程发送信号 5. 在主进程中对sigmask进行设置后,主进程创建出来的线程将继承主进

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU