嵌入式Linux文件IO,标准IO和文件IO的区别,文件描述符,open()函数,close()函数

1,标准IO和文件IO的区别

类别 标准IO 文件IO
标准规范 C标准:ANSI C 操作系统规范:POSIX(可移植操作系统接口)
读写实现 缓冲机制:先操作缓冲区,后操作实际文件,以减少系统调用次数,提高访问效率 无缓冲:每次读写都执行系统调用,读写相应文件
描述一个打开的文件 流,FILE结构体 文件描述符fd
应用 只能访问普通文件或终端文件 可以访问不同类型文件(如Linux里的七种文件类型)
关系 基于文件IO实现的,在文件IO的基础上封装了一个缓冲机制 偏下层

2,文件描述符

  1. 每个打开的文件都对应一个文件描述符
  2. 文件描述符是一个非负整数。 Linux为程序中每个打开的文件分配一个文件描述符
  3. 文件描述符从0开始分配, 依次递增。
  4. 文件IO操作通过文件描述符来完成
  5. 当程序运行的时候,系统会默认打开3个流:标准输入、标准输出、标准错误,所对应的文件描述符分别是0、1、2

3,open()函数

#include <fcntl.h>
int open(const char *path, int oflag, …);

  1. 成功时返回文件描述符; 出错时返回EOF
  2. 打开文件时使用两个参数
  3. 创建文件时第三个参数指定新文件的权限
  4. 只能通过open()打开设备文件,不能通过open()创建设备文件
原型 int open(const char *pathname, int flags, mode_t mode);
参数 pathname 被打开的文件名(可包括路径名) 。
flags O_RDONLY: 只读方式打开文件 这三个参数互斥
O_WRONLY: 可写方式打开文件。
O_RDWR: 读写方式打开文件。
O_CREAT: 如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。
O_EXCL: 如果使用O_CREAT时文件存在, 则可返回错误消息。 这一参数可测试文件是否存在。
O_NOCTTY: 使用本参数时, 如文件为终端, 那么终端不可以作为调用open()系统调用的那个进程的控制终端。
O_TRUNC: 如文件已经存在, 那么打开文件时先删除文件中原有数据。
O_APPEND: 以添加方式打开文件, 所以对文件的写操作都在文件的末尾进行。
mode 被打开文件的存取权限, 为8进制表示法。

open()示例

  1. 以只写方式打开文件1.txt。 如果文件不存在则创建, 如果文件存在则清空:
int fd;
if ((fd = open(1.txt”, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
	perror(“open”);
	return -1;
}
  1. 以读写方式打开文件1.txt。 如果文件不存在则创建, 如果文件存在则报错:
int fd;
if ((fd = open(1.txt”, O_RDWR|O_CREAT|O_EXCL, 0666)) < 0) {
	if (errno == EEXIST) {
		perror(“exist error”);
	} 
	else {
		perror(“other error”);
	}
}

4,close()函数

#include <unistd.h>
int close(int fd);

  1. 成功时返回0; 出错时返回EOF
  2. 程序结束时自动关闭所有打开的文件
  3. 文件关闭后, 文件描述符不再代表文件

猜你喜欢

转载自blog.csdn.net/m0_37542524/article/details/83663124