linux操作系统编程:
实现一个 用户程序
(1).库函数 --来实现
(2).系统调用
也就是说,程序要进行系统调用的话,有直接和间接(通过库函数)两种方式
linux里面对文件的处理:
思想:
一切皆文件
everything is file!
linux中文件类型:
b -- block -- 块设备文件 --- 硬盘 ---- ls -l /dev/sda
c -- character -- 字符设备文件 --- 鼠标 ---- ls -l /dev/input/
d -- directory -- 目录文件
- -- regular -- 普通文件
l -- link -- 软连接文件 --- 类似windows的快捷方式
p -- pipe -- 管道文件 --- 实现操作系统中 进程间的一些 信息交换(通信)
s -- socket -- 套接字文件 --- 网络的时候 (进程间的通信)
操作文件基本思路:
文件操作三步骤:
1.打开
2.读写
3.关闭
—>
1.打开 -- fopen //FILE open
2.读写 -- getchar/putchar
gets / puts
fread / fwrite
3.关闭 -- fclose
小结:
总结:
1.两种思路
库
系统调用
2.思想
一切皆文件
3.文件的操作基本步骤
a.打开
b.读写
c.关闭
学习一个函数:
1.函数的名+函数功能
2.函数的参数的使用
3.函数的返回值
补充man手册查看函数:
NAME: 函数名的介绍 以及 功能的简要说明
SYNOPSIS: 头文件+函数原型
DESCRIPTION: 函数的使用的细节 ,参数,返回值
RETURN VALUE: 函数返回值
man手册作为权威参照,但是用这个来学习一个函数比较困难
流打开函数fopen:
参数:
@path --要打开的文件的文件名(字符串形式)
@mode --打开文件的操作模式
r ---打开文件做读操作
注意:
文件必须存在
r+ 打开文件做读写操作
注意:
文件必须存在
w 打开文件做写操作
注意:
如果文件已经存在,则会将文件截断为0
如果文件不 存在,则会创建一个新文件。
w+ 打开文件做读写操作
注意:
如果文件已经存在,则会将文件截断为0
如果文件不 存在,则会创建一个新文件。
a 打开文件做写操作
注意:
如果文件已经存在,则在文件末尾进行写入
如果文件不存在,则会创建一个新文件。
a+
打开文件做读写操作
注意:
如果文件已经存在,则在文件末尾进行写入
如果文件不存在,则会创建一个新文件。
使用w或w+打开文件时,文件会截断为0,也就是文件内容会被删除,如果想要续写文件的话,只能使用a或a+的方式打开
而使用r+只能打开已经存在的文件,a+却可以创建文件,所以a+的功能相对而言比较强大
返回值:
成功 FILE *
失败 NULL 并且 设置 errno 表明错误原因
流指针:
FILE * fp
(1).流
FILE * fp;//流指针------关联一个文件
FILE * 实际上是指向了一块内存空间(缓存,fileno)
FILE实际上是一个结构体,里面存储了指定文件的全部信息,如读写位置,我们写程序时通过流这个媒介来操作文件,以便更灵活的处理
文件描述符:
文件描述符(file descriptor)是一个用于标识打开文件或I/O设备的整数值。
常见的文件描述符包括:
标准输入(stdin):文件描述符为0,宏为STDIN_FILENO,通常用于接收应用程序的输入。
标准输出(stdout):文件描述符为1,宏为STDOUT_FILENO,通常用于输出应用程序的结果。
标准错误(stderr):文件描述符为2,宏为STDERR_FILENO,通常用于输出应用程序的错误信息。
因此,我们在写程序时文件描述符从3开始,依次往下
标准IO:
标准IO处理了很多细节:
(1).处理缓冲区分配 (缓存--提高效率 --- 慢速 快速)
(2).读写IO的块长度的优化
(3).对系统调用进行了封装,内部对应的"文件描述符"
缓冲区:
行缓冲:1k, terminal,主要用于人机交互stdout
1.遇到\n刷新
2.缓存区满刷新
3.程序结束刷新
4.fflush刷新 fflush(stdout);
全缓冲:4k,主要用于文件的读写
1.缓存区满刷新
2.程序结束刷新
3.fflush来刷新 fflush(fp);
无缓冲:0k 主要用于出错处理信息的输出 stderr
不对数据缓存直接刷新(要保证出错第一时间看到)