一 编写cp命令
- 编写思路
创建新文件—打开旧文件—读出旧文件内容----写入新文件 - 函数学习
creat函数—open函数—read函数—write函数----返回的都是文件句柄–int型变量 - main函数传参的实际使用
- read函数正常读到最后返回0,读取错误才返回-1
- 深入学习
- buf数组的最大容量为何设置为4096
- 读取文件中内容的原理,文件流?
二 提高文件IO效率 : 使用缓冲
进程缓冲区:利用read函数将数据读取到进程缓冲区中,然后进程一次一次的从进程缓冲区中读取所需数据;
内核缓冲区:内核将磁盘的数据一次性大量读取存到内核缓冲区,当进程需要时,会从内核缓冲区中获取(倘若内核缓冲区没有所需数据,会先挂起进程,等待内核缓冲区读取到相应数据);利用write函数时会将进程缓冲区中的数据传输到写入到内核缓冲区,而不是磁盘,在内核缓冲区满了之后,再全部存入磁盘中。数据的直接交换是发生在两缓冲区之间的
unistd.h 中所定义的接口通常都是大量针对系统调用的封装(英语:wrapper functions),如 fork、pipe 以及各种 I/O 原语(read、write、close 等等)。
三 编写注销命令
- time()函数
- lseek()函数
- strncmp()函数–如何找出这些函数的原型和定义?
- 编写思路
- 因为系统的who与logout命令都是对utmp中的数据进行读写和修改(那么utmp中的数据又是从何而来),所以在编写自定义logout命令时,需要修改utmp中的utmp结构体中的一个成员变量ut_type来改变其登录状态,再利用time()函数修改其登录时间(什么意思???)。
- 首先打开文件,获取文件描述符fd
- 然后读取结构体,调用strncmp(与strcmp 的区别在哪?)比较ut_line(用户名)的不同,来进行选择要注销的用户数据。
- 选择出来之后,修改登录状态和相关时间,最后close()关闭文件。
- 如何根据头文件找出源文件,比如who0(),more()和time()的源文件
四 处理系统调用中的错误
想从usr目录下找出这些宏定义,于是尝试通过find函数去搜索errno.h头文件,后来发现这些以errno.h命名的头文件特别多,所以换用grep命令结合正则表达式进行层层搜索,最终找到了这些宏定义的所在地。具体如下:
- 使用该全局变量: