unix第三章高级环境编程总结

本文详细介绍了文件输入输出(I/O)操作的基础知识,包括文件描述符、open和openat函数、文件创建、关闭文件描述符、定位文件偏移量等核心概念。此外,还深入探讨了read和write函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#inlcude<unist.d>
ssize_t read(int fd, void * buf, size_t nbytes);

文件I/O
1.文件描述符<unistd.h
STDIN_FILENO -- 0

STDOUT_FILENO --1

STDERR_FILENO -- 2
文件描述符变化在 0 — OPEN_MAX -1 
2函数open和openat
#include<fcntl.h>
int open(const char * path, int oflag, .../*mode_t mode */);
int openat(int fd, const char * path, int oflag, .../* mode_t mode*
函数错误返回 -1 ,成功返回 文件描述符


将最后一个参数写....ISO C 用这个方法表示余下的参数的数量和类型是可变的。对于open函数,只有当新创建文件时,才使用最后这个参数。 
oflag参数:
O_RDONLY  // 只读打开
O_WRONLY //  只写打开
O_RDWR // 读写打开
O_EXEC  //只执行打开
O_SEARCH // 只搜索打开(应用于目录) 个人认为是目录的执行位。此常量在于目录打开时验证他的搜索权限,对目录文件的后继操作就不需要再次检查该目录的搜索权限。
上面五个常量只能指定一个,且必须指定一个。下面的为可选:
O_APPEND,O_CLOEXEC(将FD_CLOEXEC设置为文件描述符标志,若设置此标志,fork时候,关闭此文件描述符。),O_CREATE,O_DIRECTORY(若路径引用的不是目录,则出错。) O_EXC(如果同时指定了O_CREATE,而文件已经存在,则出错。如果不存在,则创建此文件。这使得测试和创建成为原子操作)。

O_NOCTTY (如果path引用的是终端文件,则不讲该终端设置为该进程的控制终端) O_NOFOLLOW(如果path引用的是一个符号链接,则出错。) O_NONBLACK(如果符号打开的是FIFO,一个块特殊文件,或一个字特殊文件,则此选项为文件的本次打开和后面的I/O操作设为非阻塞方式)。O_SYNC(使每次等待物理的i/o操作完成,包括由该write操作引起的文件属性更新所需的i/o)。O_TRUNC(文件若存在,而且只写或读写打开,则长度截断为0)。O_TTY_INIT(如果打开一个未打开的终端I/o,设置非标准termios参数值)。


 
O_DSYNC :使得write要等待物理完成,但是如果该写操作并不影响读取刚写入的数据,则不需要等待文件属性被更行
O_SYNC和O_DSYNC : 仅当文件属性需要更行以反映文件数据变化(比如更新文件以反映文件中包含了更多的数据)时,O_DSYN标志才影响文件属性。而设置O_SYNC标志后,数据和属性总是同步更新。当文件使用O_DSYNC,在重写其现有部分时,文件属性不会更新。
O_SYNC 使每一的文件描述符作为参数进行的read操作等待,直至所有对文件的的同一部分挂起的写操作完成。
 

fopen和open的关系:

fd指定为AT_FDCWD,路径名在当前工作目录获取。

3函数create
#include<fcntl.h>
int create(const char* pathnane, mode_t);
成功返回只写的文件描述符。若出错,则返回-1.
open(path, O_WRONLU | O_CREAT | O_TRUNC, mode);


4关闭文件描述符 

#include<unistd.h>
int close(int fd);
若成功,则返回0,失败返回-1。

3.6函数lseek
每一个打开文件都有一个与其相关联的“当前文件偏移量”,(当前文件偏移量显示在文件表项中)
#include<uistd.h>
off_t lseek(int fd, off_t offset, int whence);
成功返回新的文件偏移量,c出错返回-1.
whence : SEEK_SET,则将文件偏移量设置为据文件开始处的offset个字节。
         SEEK_CUR,则将文件的偏移量设置为当前值加offset,offset可为负
         SEEK_END,则将文件的偏移量设置为文件长度加offset,offset可正可负。

文件中的空洞:写的偏移量大于当前文件长度。不分配磁盘。

3.7,3.8write 和read

#include<unistd.h>
ssize_t read(int fd, void * buf, size_t nbytes);
返回读到的字节数,若到达文件尾,返回0,出错返回-1.
#include<unistd.h>
ssize_t write(int fd, const void * buf ,ssize_t nbytes);
成功返回写的字节数,出错返回-1.


3.10文件共享
进程表项文件表项和V节点表项(v节点结构是为了在一个计算机系统上的多文件类型支持的)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值