2017-2018-1 20155318 《信息安全系统设计基础》第四周学习总结
2017-2018-1 20155318 《信息安全系统设计基础》第四周学习总结
教材学习内容总结
课上实践
- 参考教材第十章内容
- 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
- 不要把代码都写入main函数中
- 要分模块,不要把代码都写入一个.c中
实现
-
man od
-
如何实现系统调用
-
open:UNIX系统的系统调用函数,区别于C语言库函数fopen。包含在头文件
#include <fcntl.h>
中,两个函数
int open(constchar*pathname, int flags);
int open(constchar*pathname, int flags, mode_t mode);
成功则返回文件描述符,否则返回-1
- read
通过 man 2 read 来了解相关知识
返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量。
- 对上个版本的myod进行修改:
- 通过调用open函数来打开文件:
fd=open(argv[1], O_RDONLY,0);
- 通过read函数来读取文件:
read(fd,&ch,1)!=0
运行结果
I/O重定向
- Unix外壳提供I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
- I/O重定向工作:一种方式是使用dup2函数
- dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd
Linux中open, read, write, seek, close
参考调用这些库函数时需要用的头文件,下面是对应的系统调用
文件的打开
FILE *fopen( "路径+文件名","读写模式");
FILE *fopen(const char *filename, const char *mode);
读写模式:(1)r -- 用于读 (2)w -- 用于写 (3)a -- 用于写,且文件必须存在
文件的写入
fwrite("写入的内容",每项字节数,长度,写入的文件的FILE指针);
size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream);
另外,strlen()函数可以获得字符串长度。
文件的关闭
fclose(FILE类指针);
fclose(FILE *pFile)
文件关闭后,写在文件缓冲区的内容才正式写入到文件中。
文件指针定位
fseek(FILE类指针,偏移量,起始位置)
int fseek( FILE *stream, long offset, int origin );
起始位置:
SEEK_CUR: 当前位置
SEEK_END: 结尾处
SEEK_SET: 开头处
文件的读取
fread("存放读取信息的字符串",每项字节数,长度,读入的文件的FILE指针);
size_t fread(void *buffer,size_t size,size_t count,FILE *stream);
其中,第一个参数可以是字符数组的名称。比如:
char ch[100];
fread(ch,1,100,pFile);
head、tail
-
通过运行“head xxx.c”和“tail xxx.c”可以发现,head、tail的作用分别是显示一个文件的前十行和后十行
-
使用命令“man -k head | grep 1”、“man -k tail | grep 1”查看帮助文档
-
head,tail使用
- 编写main.c和headtest.c
- 运行是产生如下问题:(暂未解决)