目录
1.读文件
2.写文件
例题:用读写文件实现文件的拷贝
3.错误处理
3.1strerror 函数
3.2perror 函数
4.预读入缓输出
4.1strace 命令
5.文件描述符
1.读文件
#include <unistd.h>
// 按 “字节” 读取数据
ssize_t read(int fd, void *buf, size_t count);
参数:
fd: 打开的文件描述符 ———— open() 返回值
buf: 存储读到的数据的 缓冲区
count: 缓冲区大小 size_t:无符号整数 ssize_t: 有符号整数
返回值:
成功:
没读到文件末尾: > 0
读到文件末尾: 0
失败:
-1:
errno == EAGAIN(或 EWOULDBLOCK):以非阻塞读(设备、网络)文件,没读到数据。
errno != EAGAIN(或 EWOULDBLOCK):错误!
2.写文件
#include <unistd.h>
// 按 “字节” 写出数据
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd: 打开的文件描述符 ———— open()返回值
buf: 存储待写数据的缓冲区地址
count: 数据大小 size_t:无符号整数 ssize_t:有符号整数
返回值:
成功:
> 0: 实际写出的字节数
= 0: 没写出数据
失败:
-1, errno
例题:用读写文件实现文件的拷贝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>int main(int argc, char *argv[])
{// 创建用于存储读到的数据的缓冲区char buf[1024] = {0};int n = 0;// 打开源文件int fd1 = open(argv[1], O_RDONLY);if (fd1 == -1) {perror("open src err");exit(1); // 程序非正常结束.}// 打开目标文件int fd2 = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0644); if (fd2 == -1) {perror("open dst err");exit(1); // 程序非正常结束.}// 循环从原文件中读数据,写到目标文件中.while ((n = read(fd1, buf, 1024))) {if (n < 0) {perror("read error");break; }// 读多少写多少,生成目标文件write(fd2, buf, n);}// 操作结束,关闭文件close(fd1);close(fd2);return 0;
}
3.错误处理
3.1strerror 函数
#include <string.h>
char *strerror(int errnum);
参:错误号 -- errnum -- 当前程序的唯一全局变量。
返回值:错误号对应的错误描述
错误信息:
3.2perror 函数
#include <stdio.h>
void perror(const char *s);
参:用户自定义的错误信息。 perror函数,会自动与 errno对应的错误描述,拼接。
4.预读入缓输出
- 操作系统,提高硬件访问的效率,在数据读写时,采用 预读入、缓输出。
- 程序在运行过程中,调用系统调用从用户空间进入内核空间。这个过程十分耗时。
- read、write 函数是无缓冲(无用户缓冲区) IO函数
4.1strace 命令
- 可以跟踪程序,在运行中,使用的系统调用
5.文件描述符
- pcb进程控制块:
- 本质:struct 结构体。
- 成员:文件描述符表。
- 文件描述符:0/1/2/3/4/5/6....1023
- 默认最大上限为: 1024, ulimit -a 可以查看。
- 文件描述符表使用规则:使用表中未被占用的 最小的文件描述符。
- 3个特殊文件:进程启动时,由系统自动打开,进程结束时,系统自动关闭!!!
- stdin :标准输入:0 - STDIN_FILENO
- stdout : 标准输出:1 - STDOUT_FILENO
- stderr : 标准错误: 2 - STDERR_FILENO