# 2017-2018-3 20155337《信息安全系统设计基础》第4周学习总结
2017-10-15 17:12
567 查看
2017-2018-3 20155337《信息安全系统设计基础》第4周学习总结
linux中head和tail命令的使用
命令head默认是查看文件的前10行,通过命令head /etc/passwd查看文件的前10行,也可以增加参数-n 15查看前15行,参数n在这里是指定行数的意思。我们可以通过命令man head查看更多的参数使用方法。命令tail默认是查看文件的最后10行,通过命令tail /etc/passwd查看文件的最后10行,也可以增加参数-n 5查看最后5行,参数n在这里是指定行数的意思。我们可以通过man tail查看更多的参数使用方法。命令tail经常被用来查看最新的日志信息。可以用tailf命令或者tail –f来实时查看日志信息。
head命令和tail命令的测试截图
第十章总结
关于I/O可以先参考这些文章,但是这里可能还是有所不同。分析系统级别的I/O有什么不一样的地方。文件I/O
高级I/O
标准库I/O
开篇介绍了三个级别的I/O的区别之处。所有语言的运行时系统都提供执行I/O的较高级别的工具。例如,标准I/O库;在UNIX系统中,是通过使用由内核提供的系统级I/O函数来实现这些较高级别的I/O函数的。介绍UNIX I/O和标准I/O的一般概念,展示在C程序中如何可靠地使用它们。
一、UNIX I/O
在UNIX系统中有一个说法,一切皆文件。所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行。
打开文件 打开文件操作完成以后才能对文件进行一些列的操作,打开完成过以后会返回一个文件描述符,它在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。
改变当前的文件位置。
读写文件
关闭文件 应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。
二、打开和关闭文件
关于打开文件的基本操作,这里就不再累述,就是关于几个函数的解释,在上面的三篇文章中有解释。 int open(char *filename,int flags,mode_t mode); 其中打开标志flags有三种基本标志:O_RDONLY、O_WRONLY、O_RDWR。也可以和其他三种(O_CREAT、O_TRUNC、O_APPEND)组合使用。mode参数指定了新文件的访问权限位。(这次终于看到完全的mode参数的使用方法了)
三、读和写文件
在系统I/O中读写文件用的系统函数为read()和write()函数来执行。
[cpp] view plain copy #include <unistd.h> ssize_t read(int fd,void * buf,size_t n); ssize_t write(int fd,void *buf,size_t n);
read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量。而write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。返回值要么为-1要么为写入的字节数目。
[cpp] view plain copy /* $begin cpstdin */ #include "csapp.h" int main(void) { char c; while(Read(STDIN_FILENO, &c, 1) != 0) Write(STDOUT_FILENO, &c, 1); exit(0); } /* $end cpstdin */
关于在文件中定位使用的函数为lseek,在I/O库中使用的函数为fseek。 (ps:size_t和ssize_t的区别,前者是unsigned int,而后者是int) 有些情况下,read和write传送的字节比应用程序要求的要少,出现这种情况的原因如下:
读时遇到EOF。此时read返回0来发出EOF信号。
从终端读文本行。如果打开文件是与终端相关联,那么每个read函数将以此传送一个文本行,返回的不足值等于文本行的大小。
读和写网络套接字。可能会出现阻塞现象。
实际上,除了EOF,在读磁盘文件时,将不会遇到不足值,而且在写磁盘文件时,也不会遇到不足值。然而,如果你想创建健壮的网络应用,就必须反复调用read和write处理不足值,直到所有需要的字节都传送完毕。
myod
myod代码实现:head.c
#ifndef _HEAD_H_ #define _HEAD_H_ void myod(FILE *file,int n1,int n2,int n3,int n4); #endif main.c #include <stdio.h> #include <stdlib.h> #include"head.h" int main(int argc,char *argv[]) { int i; int n1=0,n2=0,n3=0,n4=0; for(i=1;i<argc-1;i++) { switch(argv[i][2]) { case 'c':n1=1;break; case 'x':n2=1;break; case 'd':n3=1;break; case 'o':n4=1;break; } } FILE *file=fopen(argv[argc-1],"r"); if(file==NULL){printf("Error!\n");exit(0);} myod(file,n1,n2,n3,n4); return 0; } myod.c #include<stdio.h> void myod(FILE *file,int n1,int n2,int n3,int n4) { char ch,line[16]; int i; int j=0; while((ch=fgetc(file))!=EOF){ line[j%16]=ch; if((j+1)%16==0){ if(n1){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("%5s","\\n");continue;} if(line[i]=='\t') {printf("%5s","\\t");continue;} putchar(line[i]); putchar(' '); putchar(' '); putchar(' '); putchar(' '); } putchar('\n');} if(n2){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("0%-4x",'\n');continue;} if(line[i]=='\t') {printf("0%-4x",'\t');continue;} printf("%-5x",line[i]); } putchar('\n'); } if(n3){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("%-5d",'\n');continue;} if(line[i]=='\t') {printf("%-5d",'\t');continue;} printf("%-5d",line[i]); } putchar('\n'); } if(n4){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("%-5o",'\n');continue;} if(line[i]=='\t') {printf("%-5o",'\t');continue;} printf("%-5o",line[i]); } putchar('\n'); } printf("下一行!\n"); } j++; } }
#ifndef _HEAD_H_ #define _HEAD_H_ void myod(FILE *file,int n1,int n2,int n3,int n4); #endif main.c #include <stdio.h> #include <stdlib.h> #include"head.h" int main(int argc,char *argv[]) { int i; int n1=0,n2=0,n3=0,n4=0; for(i=1;i<argc-1;i++) { switch(argv[i][2]) { case 'c':n1=1;break; case 'x':n2=1;break; case 'd':n3=1;break; case 'o':n4=1;break; } } FILE *file=fopen(argv[argc-1],"r"); if(file==NULL){printf("Error!\n");exit(0);} myod(file,n1,n2,n3,n4); return 0; } myod.c #include<stdio.h> void myod(FILE *file,int n1,int n2,int n3,int n4) { char ch,line[16]; int i; int j=0; while((ch=fgetc(file))!=EOF){ line[j%16]=ch; if((j+1)%16==0){ if(n1){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("%5s","\\n");continue;} if(line[i]=='\t') {printf("%5s","\\t");continue;} putchar(line[i]); putchar(' '); putchar(' '); putchar(' '); putchar(' '); } putchar('\n');} if(n2){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("0%-4x",'\n');continue;} if(line[i]=='\t') {printf("0%-4x",'\t');continue;} printf("%-5x",line[i]); } putchar('\n'); } if(n3){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("%-5d",'\n');continue;} if(line[i]=='\t') {printf("%-5d",'\t');continue;} printf("%-5d",line[i]); } putchar('\n'); } if(n4){for(i=0;i<16;i++) { if(line[i]=='\n') {printf("%-5o",'\n');continue;} if(line[i]=='\t') {printf("%-5o",'\t');continue;} printf("%-5o",line[i]); } putchar('\n'); } printf("下一行!\n"); } j++; } }
运行结果截图:
相关文章推荐
- 2017-2018-1 20155223 《信息安全系统设计基础》第4周学习总结
- 2017-2018-1 20155330 《信息安全系统设计基础》第4周学习总结
- # 2017-2018-1 20155337《信息安全系统设计基础》第5周学习总结+mybash
- 2017-2018-1 20155316 《信息安全系统设计基础》第4周学习总结
- # 20155337 2017-2018-1 《信息安全系统设计基础》第一周学习总结
- # 2017-2018-3 20155337《信息安全系统设计基础》第3周学习总结
- 2017-2018-1 20155202 《信息安全系统设计基础》第4周学习总结
- 2017-2018-1 20155319 《信息安全系统设计基础》第4周学习总结
- # 2017-2018-1 20155231 《信息安全系统设计基础》第4周学习总结
- # 2017-2018-1 20155337《信息安全系统设计基础》第十一周学习总结
- 2017-2018-1 20155212 《信息安全系统设计基础》第4周学习总结
- # 2017-2018-1 20155337《信息安全系统设计基础》第7周学习总结
- 2017-2018-1 学号20155329 《信息安全系统设计基础》第4周学习总结
- 2017-2018-1 20155311 《信息安全系统设计基础》第4周学习总结
- # 2017-2018-1 20155337《信息安全系统设计基础》第十四周学习总结
- 2017-2018-1 20155306 《信息安全系统设计基础》第4周学习总结
- # 2017-2018-1 20155337《信息安全系统设计基础》第9周学习总结
- 2017-2018-1 20155337《信息安全系统设计基础》第6周学习总结
- 2017-2018-1 学号20155329 《信息安全系统设计基础》第4周学习总结
- 2017-2018-1 20155321 《信息安全系统设计基础》第4周学习总结