Linux文件I/O学习

半生浮沉@ZXG 2020-06-22 01:15:25
Linux系统编程:简单文件IO操作
一、 文件描述符:
(1) 文件描述符其实实质上是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护整个动态文件的这些数据结构挂钩绑定上了,以后我们的应用程序如果需要操作整个动态文件,只需要用整个文件描述符进行区分。
(2) 按照惯例,UNIX系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。在符合POSIX.1的应用程序中,幻数0、1、2虽然已经被标准化,但应当把他们替换成符号常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO以提高可读性。这些常数定义在<unistd.h>文件中。
(3) 文件描述符就是用来区分一个程序打开的多个文件。
(4) 文件描述符的作用域就是当前进程,出了当前进程整个文件描述符就没有意义了。
(5) Open返回的fd必须记录好,以后向整个文件的所有操作都要靠整个fd去对应这个文件,最后关闭文件时也需要fd去指定关闭这个文件,如果我们关闭文件前fd丢了,那么这个文件就没法关闭了也没法去读写了。
二、 什么是I/O
1、 输入/输出是主存和外部设备之间拷贝数据的过程
(1) 设备->内存 (输入操作)
(2) 内存->设备(输出操作)
2、 对linux来说,有2种类型的I/O:
(1) ANSIC提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O
(2) 低级I/O,通常也称为不带缓冲的I/O

三、文件IO相关头文件:
一般头文件在/usr/include下面,这里是标准C程序头文件,如果你的头文件前面加了<sys/*>那说明这是系统调用函数头文件,其在/usr/include/sys下面。
#include <unistd.h>
符号常量是POSIX标准定义的unix系统定义符号常量的头文件,包含了许多UINX系统服务的函数原型,例如read函数write函数和getpid函数。
#include <fcntl.h>
fcntl.h,是unix标准的通用头文件,其中包含了相关函数有open,fcntl,shutdown,unlink,fclose等
#include <sys/types.h>
基本系统数据类型,是UINX/LINUX系统的基本数据类型的头文件,含size_t,time_t,pid_t等类型。
#include <sys/stat.h>
文件状态,是Uinx/linx系统定义的文件状态所在的伪标准头文件含有以下类型:
dev_t st_dev Device ID of device containing file.
ino_t st_ino File serial number.
mode_t st_mode Mode of file (see below).
nlink_t st_nlink Number of hard links to the file.
uid_t st_uid User ID of file.
gid_t st_gid Group ID of file.
dev_t st_rdev Device ID (if file is character or block special).
off_t st_size For regular files, the file size in bytes.
For symbolic links, the length in bytes of the
pathname contained in the symbolic link.

For a shared memory object, the length in bytes.

For a typed memory object, the length in bytes.

For other file types, the use of this field is
unspecified.
time_t st_atime Time of last access.
time_t st_mtime Time of last data modification.
time_t st_ctime Time of last status change.
int chmod(const char *, mode_t);
int fchmod(int, mode_t);
int fstat(int, struct stat *);
int lstat(const char *restrict, struct stat *restrict);
int mkdir(const char *, mode_t);
int mkfifo(const char *, mode_t);
int mknod(const char *, mode_t, dev_t);
int stat(const char *restrict, struct stat *restrict);
mode_t umask(mode_t);
使用stat函数最多的可能是ls –l命令,用其可以获得有关一个文件的所有信息.
#include <errno.h>
在系统编程中错误通常通过函数返回值雷表示,并通过特殊变量errno来描述。
在errno这个全局变量在<errno.h>头文件中声明如下:
exitern int errno
错误处理函数
perror
strerror
四、文件描述符与文件指针相互转换
对于系统调用中的文件描述符与ANSI C标准中的文件指针可以通过以下函数进行转换:
1、 fileno:将文件指针转换成文件描述符
2、 fdopen:将文件描述符转换为文件指针

五、文件系统调用
1、open系统调用
(1)有几种方法可以获得允许访问文件的文件描述符,最常用的是使用open()系统调用。
2、函数原型
Int open(const char *path, int flags);
参数
Path: 文件的名称,也可以包含(绝对和相对)路径
Flags: 文件的打开模式
返回值
打开成功,返回文件描述符;非负整数
打开失败,返回-1
六、

...全文
48 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,117

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧