20155236 2017-2018-1 《信息安全系统设计基础》第4周学习总结
C语言实现Linux命令——od 补做
实现要求:
1.复习c文件处理内容
2.编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3.main与其他分开,制作静态库和动态库
4.编写Makefile
5.提交测试代码和运行结果截图 6.提交调试过程截图,要全屏,包含自己的学号信息
od命令
- od命令常用于输出文件的八进制、十六进制或其它编码字节,用于显示或查看文件中不能直接显示于终端的字符。
- 常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。
第十章系统级I/O输入运用:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
- open函数是将文件名转换为一个文件描述符,并且返回描述数字。
- 调用主函数main时,有两个参数,第一个参数表示运行程序时命令行中参数的数目;第二个参数表示指向字符串数组的指针,其中每个字符串对应一个参数。
main(int argc, char *argv[])
最后运行结果:
head,tail的使用
head命令
head
用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。格式:head [参数]... [文件]...
- 命令:
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数 - 伪代码:
int main(){
从命令行参数读入文件和行号;
将行号转为由数组转为整数;
打开文件;
将文件读入数组buf;
进入函数tail;
关闭;
}
void tail(){
使用count来记录行号;
没有到数组的结尾,i循环{
if(行号小于等于输入的行号){
按行输出字符;
}
if(等于输入的行号){
结束循环,停止输出;
}
}
}
应用实例:
tail命令
tail
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
- 命令:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
-pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S与-f合用,表示在每次反复的间隔休眠S秒
应用实例:
第十章教材学习内容总结
系统级I/O
- 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程,输入操作是从I/O设备拷贝数据到主存,输出操作是从主存拷贝数据到I/O设备
打开和关闭文件
- open函数:打开一个已存在的文件或者创建一个新文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *filename,int flags,mode_t mode);
- close函数:关闭一个打开的文件
#include <unistd.h>
int close(int fd);
读和写文件:
- 应用程序是通过分别调用read和write函数来执行输入和输出的
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t n);
ssize_t write(int fd,const void *buf,size_t n);
读取文件元数据:
- 检索文件信息(元数据):应用程序能够通过调用stat和fstat函数
#include <unistd.h>
#include <sys/stat.h>
int stat(const char *filename,struct stat *buf);
//stat函数以一个文件名作为输入,填写一个stat数据结构中的各个成员。
int fstat(int fd,struct stat *buf);
//fstat函数以文件描述符而不是文件名作为输入。
教材学习中的问题和解决过程
- csapp.h这个头文件不是Linux系统自带的一个头文件。
- 将csapp.h和csapp.c两个文件,下载完毕后拷贝到与待编译代码10.1.c同一个文件夹下
先对csapp.c和10.1.c进行编译:gcc -c csapp.c 10.1.c
再进行链接:gcc -o test csapp.o 10.1.o -lpthread
在使用gcc编译时必须加上选项-lpthread
,否则会报错。
代码调试中的问题和解决过程
#include "csapp.h"
int main()
{
int fd1,fd2;
fd1 = Open("foo.txt", O_RDONLY, 0);
Close(fd1);
fd2 = Open("baz.txt", O_RDONLY, 0);
printf("fd2 = %d
", fd2);
exit(0);
}
- 在编译时会报错,提示没有 csapp.h 这个文件或目录,意思就是该代码的源文件中不能读取头文件csapp.h
- 查看代码发现仅用到open函数和close函数,所以将csapp.h头去掉,换成俩函数应有的那几个头文件即可(同时须将Open和Close首字母改为小写,变为标准的Unix I/O)
不过细看代码应该不难发现,源代码中其实不是open函数和close函数,而是Open和Close.
上周错题总结
本篇博客已体现
本周结对学习情况
I/O函数的使用
-
应用程序可以通过open、close、lseek、read、write和stat这样的函数来访问Unix I/O。 RIO函数:read和write的健壮的包装函数,自动处理不足值,为读文本行提供一种高效的带缓冲的方法。
-
标准I/O函数:提供了Unix I/O函数的一个更加完整的带缓冲的替代品,包括格式化的I/O例程。是磁盘和终端设备I/O之选。
-
套接字描述符:Unix对网络的抽象是一种称为套接字的文件类型,被称为套接字描述符。应用进程通过读写套接字描述符来与运行在其他计算机上的进程通信。
-
对流I/O限制是:跟在输出函数之后的输入函数,必须在其中间插入fflush、fseek、fsetpos或者rewind函数,后三个函数使用Unix I/O中的lseek函数来重置当前的文件位置。跟在输入函数之后的输出函数,必须在中间插入fseek、fsetpos或者rewind的调用,一个输出函数不能跟随在一个输入函数之后,除非该输入函数遇到了一个EOF。
-
解决对流I/O限制的方法是:采用在每个输入操作前刷新缓存区这样的规则来满足。
对同一个打开的套接字描述符打开两个流,一个用来读,一个用来写。 -
对套接字使用lseek函数是非法的。
-
在网络套接字上,使用RIO函数更常见。
代码截图
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10/10 | 1/1 | 10/10 | |
第二周 | 100/100 | 1/2 | 19/25 | |
第三周 | 200/278 | 1/3 | 10/36 | |
第四周 | 200/278 | 1/4 | 10/46 |