LINUX复习_1_文件& I/O操作

概念说明
1:linux中一切都是文件
 文件是linux对大多数系统资源访问的接口
 常见的文件类型:普通文件,设备文件,目录文件,管道文件,套接字,链接文件
 普通文件:文本文件(行结构 存储),二进制文件(可执行文件,图像,声音)

2: / 文件系统的根 cd /即可到根目录
3:“.”代表该文件 “..”代表该目录的父目录
这里写图片描述

4:挂载
挂载的意义是将磁盘分区的内容放到某个目录下
命令 mount
5:用户权限
这里写图片描述
      RWX //读、写、执行权限

增加权限: chmod 777 filename //777 对应111 111 111

file hello //获取hello文件的文件信息

6:使用 ls -l来查看文件属性 看第一个字符如:”- rw- rw- r– ”
第一个符号是:”-“:普通文件
第一个符号是:”d“:目录文件(directory)
第一个字符是:”c“:字符设备文件(高速缓存设备),“b”块设备文件(非高速缓存设备)
第一个字符是:”p“:管道文件(先进先出文件FIFO)只针对进程间的通信,本地通讯
ps:创建一个管道文件:mknod mypip p
第一个字符是:”s“:套接字(socket),类似于管道文件,但是用于网络通信
第一个字符是:“1”符号链接文件(包含另一个文件的路径名,类似于超链接)

7:和文件操作相关的最基本的元素是:目录结构,索引节点和文件的数据本身。

(1)目录结构。
    系统中的每一个目录都处于一定的目录结构当中。 目录结构含有目录中所有目录的列表,每个目录项都含有一个文件名称和一个索引节点。借助于名称,应用程序可以访问目录项的内容,而索引节点提供了文件自身的信息。所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。

(2)索引节点。
     目录结构包含文件名称和目录位置等信息,而索引节点本身并不包含这些信息,因为 Linux 允许使用多个文件名来引用磁盘上的同一块数据,多个文件名都可以访问同一个索引节点。索引节点包含了一个文件的访问权限、文件大小、文件最后更改的时间、文件的所有者和文件相关的特殊标志以及其他细节。

(3)文件的数据,
   它的存储位置由索引节点指定。有些特殊文件,比如管道及设备文件,在硬盘上不具有数据区域。而普通文件和目录都拥有数据区域。

8:IO调用–> 系统调用I/O & 基于流的I/O
  8.1:简单说明 
    系统调用的 I/O 方法提供了最基本的文件访问接口,包括 open()、 close()、 write()、read()和 lseek()等。
    基于流的 I/0 方法实际上是建立在系统调用的 I/0 方法基础上的 C 函
数库, 它基于系统调用方法的封装并增加了额外的功能
  8.2:区别
  (1)基于流的文件操作函数的名字都是以字母“f” 开头,而系统调用函数则不同。例如
流函数 fopen()对应于系统调用的 open()。
  (2)系统调用 I/0 方法是更低一级的接口,通常完成相同的任务是,比使用基于流的 I/0
方法需要更多编码的工作量。
  (3)系统调用直接处理文件描述符,而流函数则处理“FILE*” 类型的文件句柄。
  (4)基于流的 I/0 方法是对系统调用方法的封装,流 I/0 方法使用自动缓冲技术,使程
序能减少系统调用,从而提高程序的性能。
  (5)基于流的 I/0 方法可以支持格式化输出,比如使用 fprintf()这样的函数。
  (6)基于流的 I/0 方法替用户处理有关系统调用的细节,比如系统调用被信号中断的处理等等

IO操作
9:open() & creat()常用的打开和创建文件函数。

creat()相当于 open 使用了参数 flags 等于 O_CREAT()|O_WRONLY|O_TRUNC

10:若要保证数据写入磁盘等物理内存设备中,可以用该函数
int fsync ( int fd ) //刷新缓存区

11:read() & write()
函数原型:
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
上述要注意:buf的长度一定要大于等于count

12:iseek()
          略
13:int access(const char *pathname, int mode);
参数 pathname 是要判断的文件路径名。参数 mode 可以是以下值或者是他们的组合:
R_OK:判断文件是否有读权限。
W_OK:判断文件是否有写权限。
X_OK:判断文件是否有可执行权限。
F_OK:判断文件是否存在。
在上述组合中,F_OK我觉得会经常用到,在linux下查看设备文件是否存在。存在仔继续相应操作。

14:文件修改属性
当文件被打开之后,进程会获得一个文件描述符,文件描述符包含了文件描述符标志以及当前进程对文件的访问权限等信息文件状态标志。当我们需要获取或者修改文件描述符中包含的标志时,可以使用 fcntl()系统调用。其函数原型时:
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);

fcntl()是第一个参数 fd 是文件描述符,第二个参数指定了函数的操作, fcntl()函数

常用的功能有:
复制一个文件描述符(cmd = F_DUPFD)。
获取/设置文件描述符标志(cmd = F_GETFD 或 cmd = F_SETFD)。
获取/设置文件状态标志(cmd = F_GETFL 或 cmd = F_SETFL)。
获取/设置文件锁(cmd = F_GETLK、 cmd = F_SETLK 或 cmd = F_SETLKW)。
第五种功能中, fcntl()用于控制文件锁的时候, 第三个函数参数是一个 struct flock
结构体。文件锁的具体使用,我们将在进程间通信的章节中再详细描述。
      
其他 cmd 指定的操作的主要功能是:
F_DUPFD,复制文件描述符,新的文件描述符作为函数返回值返回。新的文件描述符与原文
件描述符 fd 共同指向同一个文件,但是它有自己的一套文件描述符标 志。
F_GETFD , 获 取 fd 对 应 文 件 描 述 符 标 志 。 目 前 只 有 一 个 可 用 的 文 件 描 述 符 标 志
FD_CLOEXEC,当 FD_CLOEXEC 标志位等于 0 的时候,进程派生出的子进程用 exec 运行新的程序是,文件句柄被保留, 子进程仍可使用这个文件句柄。 FD_CLOEXEC 标志位等于 1 的时候文件描述符会被关闭。默认 FD_CLOEXEC 标志位等于 O。
F_SETFD,设置文件描述符标志,通过第三个参数设置。
F_GETFL, 获取文件描述符对应的文件标志。
F_SETFL , 设 置 文 件 描 述 符 对 应 的 文 件 标 志 。 可 以 更 改 的 标 志 包 括 : 0_APPEND 、O_ASYNC、 O_DIRECT、 O_NOATIME 和 O_ NONBLOCK。(这个常用,阻塞非阻塞)

fcntl()函数,根据 cmd 的不同, 函数执行成功时返回值的含义各不相同,函数执行失败的时候,返回-1。

基于流的文件操作

15:文件创建打开,关闭,fopen()、fclose()

FILE *fopen(const char *path, const char *mode); //不能设置权限
int fclose(FILE *fp);

16:单个字符的读取,写入

int fgetc(FILE* stream);
int getc(FILE* stream);

int fputc(int c, FILE* stream);
int puct(int c, FILE* stream);

函数 fgetc()和 fputc()用于从指定文件中读出一个字符或把一个字符写入指定的文件。 fgetc()和 fputc()分别还有另外一个别名 getc()和 putc(),它们的使用方法和功能是完全一样的,只是后者是前者的宏定义的
别名。

fgetc()用 unsigned char 的格式来读取一个字符并映射为一个 int 值,如果读取正确,返回读取的字符的 int 值;否则,当读取错误或遇到文件结束标志 EOF 时,返回 EOF。
EOF在头文件的定义为-1。

17:按字符串读写

Fgets()函数从文件中读入一行以“ \n” 或 EOF 结尾的字符串。 Fgets 函数原型是:

char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
这俩函数的返回值不一样!!!

18:数据块读写fread(),fwrite()
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);


19:文件的格式化输入输出
int fprintf(FILE *stream, const char *format, …)
int fscanf(FILE *stream, const char *format, …);

20:随机存取

若非一开始打开文件是没有指定a,a+这种追加模式,文件打开一般都是在头部指针位置开始,每次后移,直至文件尾。
fseek()函数提供了非常类似与 lseek()系统调用方法,可以使文件指针移动到文件中的指定位置。
下面是fseek()的函数原型。
int fseek(FILE *stream, long off’set, int whence);

fseek()的三个参数分别是:

stream:文件句柄
offset:指针移动的偏移量,单位为字节数
whence:文件指针移动偏移量的解释,有三个选项,如下
  EEK_SET 从文件头开始计算,文件指针移动到 offset 个字节的位置。
  SEEK_CUR 从文件指针当前位置开始计算,向后移动 offset 个字节的位置。
  SEEK_END 文件指针移动到文件结尾.

附:
C 库还提供了获得当前指针位置的函数 ftell():
long ftell(FILE *stream);
ftell()的参数是文件句柄,函数执行成功时返回文件指针的当前位置。失败时返回-l。

还有两个函数可以对文件指针进行操作:
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);

这两个函数分别可以获取和设置文件指针的位置。文件指针的设置或返回都通过函数的第二个参数 pos 来传递。 fgetpos()函数和 fseek()指定了 SEEK_SET 的参数时的功能时完全
一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值