【linux编程实践教程(Bruce Molay)】第二章 用户,文件操作与联机帮助:其二

一 编写cp命令

  1. 编写思路
    创建新文件—打开旧文件—读出旧文件内容----写入新文件
  2. 函数学习
    creat函数—open函数—read函数—write函数----返回的都是文件句柄–int型变量
  3. main函数传参的实际使用
  4. read函数正常读到最后返回0,读取错误才返回-1
  5. 深入学习
    • buf数组的最大容量为何设置为4096
    • 读取文件中内容的原理,文件流?

二 提高文件IO效率 : 使用缓冲

进程缓冲区:利用read函数将数据读取到进程缓冲区中,然后进程一次一次的从进程缓冲区中读取所需数据;
内核缓冲区:内核将磁盘的数据一次性大量读取存到内核缓冲区,当进程需要时,会从内核缓冲区中获取(倘若内核缓冲区没有所需数据,会先挂起进程,等待内核缓冲区读取到相应数据);利用write函数时会将进程缓冲区中的数据传输到写入到内核缓冲区,而不是磁盘在内核缓冲区满了之后,再全部存入磁盘中。数据的直接交换是发生在两缓冲区之间的

unistd.h 中所定义的接口通常都是大量针对系统调用的封装(英语:wrapper functions),如 fork、pipe 以及各种 I/O 原语(read、write、close 等等)。

三 编写注销命令

  1. time()函数
  2. lseek()函数
  3. strncmp()函数–如何找出这些函数的原型和定义?
  4. 编写思路
    • 因为系统的who与logout命令都是对utmp中的数据进行读写和修改(那么utmp中的数据又是从何而来),所以在编写自定义logout命令时,需要修改utmp中的utmp结构体中的一个成员变量ut_type来改变其登录状态,再利用time()函数修改其登录时间(什么意思???)。
    • 首先打开文件,获取文件描述符fd
    • 然后读取结构体,调用strncmp(与strcmp 的区别在哪?)比较ut_line(用户名)的不同,来进行选择要注销的用户数据。
    • 选择出来之后,修改登录状态和相关时间,最后close()关闭文件。
  5. 如何根据头文件找出源文件,比如who0(),more()和time()的源文件

四 处理系统调用中的错误

  1. 在这里插入图片描述
    想从usr目录下找出这些宏定义,于是尝试通过find函数去搜索errno.h头文件,后来发现这些以errno.h命名的头文件特别多,所以换用grep命令结合正则表达式进行层层搜索,最终找到了这些宏定义的所在地。具体如下:
    在这里插入图片描述
  2. 使用该全局变量:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值