open()和openat()函数:

#include <fcntl.h>

// 成功返回文件描述符,出错返回-1
int open(const char *path, int oflag, ... /* mode_t mode */);
int openat(int fd, const char *path, int oflag, ... /* mode_t mode */);
int creat(const char *path, mode_t mode);
// creat()因为历史原因,作为弥补open()不能打开一个尚未存在的文件的这个缺憾而存在
// 而随着opne()提供了O_CREAT和O_TRUNC之后就不需要creat()函数了
// mode参数在打开一个不存在的文件时(创建新文件)需要指定
// path参数为绝对路径: fd参数被忽略,open()与openat()效果相同
// path参数为相对路径: fd为该相对路径的起始地址
// openat()函数实际上就是为了可以使用相对路径打开目录中的文件和避免TOCTTOU错误产生的

mode参数的值有点类似与创建IPC对象所用的mode常值,但有点区别,以下时open()使用的mode值:
S_IRUSR 用户读
S_IWUSR 用户写
S_IXUSR 用户执行
S_IRGRP 组读
S_IWGRP 组写
S_IXGRP 组执行
S_IROTH 其他用户读
S_IWOTH 其他用户写
S_IXOTH 其他用户执行

oflag参数取值:
O_RDONLY, O_WRONLY, or O_RDWR
可选值
O_APPEND, O_CLOEXEC, O_CREAT, O_DIRECTORY, O_EXCL, O_NOCTTY, O_NOFOLLOW, O_NONBLOCK,
O_SYNC, O_TRUNC, O_TTYINIT
同样的函数,在Linux上的实现及相关实现http://man7.org/linux/man-pages/man2/open.2.html

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode); int creat(const char *pathname, mode_t mode); int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);

close()函数:

#include <unistd.h>

// 关闭一个打开着的文件,成功返回0,出错返回-1
int close(int fd);

lseek()函数:

#include <unistd.h>

// 设置文件偏移量,成功返回新的文件偏移量,出错返回-1
off_t lseek(int fd, off_t offset, int whence);
// fd为被设置的文件的描述符,offset为偏移量(offset可正可负),whence决定从文件哪个位置怎么偏移

whence参数取值:
SEEK_SET: 将文件偏移量设置为距文件开始处offset个字节
SEEK_CUR: 将文件偏移量设置为当前偏移量加上offset
SEEK_END: 将文件偏移量设置为文件长度加上offset

注意:有的文件允许当前偏移量为负值,因此在检查lseek()执行是否成功时,应该检查返回值
是否为-1,而不能检查其是否小于零

read()、write()、pread()、pwrite()函数:

#include <unistd.h>

// 从文件读取数据和向文件写数据
// 成功则返回读或写的字节数,出错返回-1
ssize_t read(int fd, void *buf, size_t nbytes);
ssize_t write(int fd, const void *buf, size_t nbytes); // 相当于先调用lseek()后再调用read()或write(),但相对于分开二个函数,此处函数操作是原子的
ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);

dup()和dup2()函数:

#include <unistd.h>

// 复制一个现有的文件描述符,若成功返回新的文件描述符,出错返回-1
int dup(int fd);
int dup2(int fd, int fd2);

相对于dup(),dup2()可以用fd2指定新的文件描述符值
若果fd2已经打开,则dup2()先将其关闭,当fd2等于fd,则返回fd2,而不关闭它
注意:不要把文件描述符当做int,认为可以通过赋值语句赋值一个文件描述符

文件同步相关函数:

#include <unistd.h>

void sync(void);
// 成功返回0,出错返回-1
int fsync(int fd);
int fdatasync(int fd);

在向文件中写入数据时,内核会先将数据复制到缓冲区,然后排入队列,晚些时候在写入磁盘(延迟写)
在为了保证实际文件系统与缓冲区中内容一致性时,我们使用上述的三个函数
sync()将所有修改过的块缓冲区排入写队列,然后返回,并不等待实际的写磁盘操作是否完成
fsync()同步时,只对fd指定的文件有用,且等待实际写磁盘操作结束才返回
fdatasync()与fsync()类似,但只更新文件数据,而fsync()出数据外还更新文件属性

fcntl()函数:

#include <fcntl.h>

// 若成功,返回值由cmd参数决定,出错返回-1
int fcntl(int fd, int cmd, ... /* arg */);

关于fcntl()函数的man文档中的描述:https://linux.die.net/man/2/fcntl
具体解释(中文):https://www.cnblogs.com/xuyh/p/3273082.html

ioctl()函数:

#include <unistd.h>

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

文件I/O相关函数的更多相关文章

  1. day08-Python运维开发基础(文件操作与相关函数、函数基础)

    1. 文件操作及相关函数 # ### 文件操作 """ fp = open("文件名称",mode=模式,encoding=编码集) fp 文件io对 ...

  2. C++->输入输出文件流的相关函数

    标准输入输出流与文件输入输出流的关系图: 文件输出流头文件“ofstream/fstream”,文件输入流头文件“ifstream/fstream” 1.1.打开文件方式:流类 对象名(文件名,方式) ...

  3. FILE文件操作

    http://www.jb51.net/article/37688.htm fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FI ...

  4. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  5. 【Linux C中文函数手册】文件内容控制函数

    文件内容控制函数 1)clearerr 清除文件流的错误旗标 相关函数 feof表头文件 #include<stdio.h>定义函数 void clearerr(FILE * stream ...

  6. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  7. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  8. Unix/Linux环境C编程入门教程(40) 初识文件操作

     1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...

  9. php基础知识--文件操作

    文件操作 文件 广义角度: 任何一个在磁盘上可以看到的符号(包含真正的文件及文件夹) 狭义角度: 真实存储数据的载体(不包含文件夹, 如doc文件,txt文件等) 文件操作: 对文件的增删改查 文件分 ...

随机推荐

  1. BZOJ 4820 [Sdoi2017]硬币游戏 ——期望DP 高斯消元

    做法太神了,理解不了. 自己想到的是建出AC自动机然后建出矩阵然后求逆计算,感觉可以过$40%$ 用一个状态$N$表示任意一个位置没有匹配成功的概率和. 每种匹配不成功的情况都是等价的. 然后我们强制 ...

  2. Flask获取post提交数据

    完成示例 # flask 代码 from flask import Flask,request ... @app.route('/get_tasks',methods=["POST" ...

  3. 标准C程序设计七---77

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  4. Install Battery Historian

    1. Recommended extra packages for Trusty 14.04 $ sudo apt-get update $ sudo apt-get install \ linux- ...

  5. ScrollView 嵌套WebView 的问题优化

    一.布局样式 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:androi ...

  6. 总结下web开发中基础性的常识

    一,HTML/5 1,浏览器渲染过程 主流浏览器渲染过程叫法有区别,但是主要流程还是相同的.Gecko 将视觉格式化元素组成的树称为“框架树”.每个元素都是一个框架.WebKit 使用的术语是“呈现树 ...

  7. python 当pip不能用的时候可以去找python安装包

    初学python,一直pip安装各种包,突然间有一天pip莫名其妙不能用了,除了pip help全部都是没反应 百度好像没人出现过pip挂掉的情况 花了一小时修复pip,卸载啊,路径啊,全部无效 百度 ...

  8. FZU 2122 又见LKity【字符串/正难则反/KMP/把一个字符串中某个部分替换为另一个部分】

    嗨!大家好,在TempleRun中大家都认识我了吧.我是又笨又穷的猫猫LKity.很高兴这次又与各位FZU的ACMer见面了.最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压 ...

  9. HDU 5794 A Simple Chess(杨辉三角+容斥原理+Lucas定理)

    题目链接 A Simple Chess 打表发现这其实是一个杨辉三角…… 然后发现很多格子上方案数都是0 对于那写可能可以到达的点(先不考虑障碍点),我们先叫做有效的点 对于那些障碍,如果不在有效点上 ...

  10. SpringCloud 分布式事务解决方案

    目录 TX-LCN分布式事务框架 TX-LCN分布式事务框架 随着互联化的蔓延,各种项目都逐渐向分布式服务做转换.如今微服务已经普遍存在,本地事务已经无法满足分布式的要求,由此分布式事务问题诞生. 分 ...