# 2017-2018-3 20155337《信息安全系统设计基础》第4周学习总结

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!
");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]=='
')
            {printf("%5s","\n");continue;}
	    if(line[i]=='	')
            {printf("%5s","\t");continue;}
            putchar(line[i]);
            putchar(' ');
            putchar(' ');
            putchar(' ');
            putchar(' ');
        }
        putchar('
');}
        if(n2){for(i=0;i<16;i++)
        {
            if(line[i]=='
')
            {printf("0%-4x",'
');continue;}
	    if(line[i]=='	')
            {printf("0%-4x",'	');continue;}
            printf("%-5x",line[i]);
        }
        putchar('
');
        }

        if(n3){for(i=0;i<16;i++)
        {
            if(line[i]=='
')
            {printf("%-5d",'
');continue;}
	    if(line[i]=='	')
            {printf("%-5d",'	');continue;}
            printf("%-5d",line[i]);
        }
        putchar('
');
        }
        if(n4){for(i=0;i<16;i++)
        {
            if(line[i]=='
')
            {printf("%-5o",'
');continue;}
	    if(line[i]=='	')
            {printf("%-5o",'	');continue;}
            printf("%-5o",line[i]);
        }
        putchar('
');
        }
        printf("下一行!
");
	}
	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!
");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]=='
')
            {printf("%5s","\n");continue;}
	    if(line[i]=='	')
            {printf("%5s","\t");continue;}
            putchar(line[i]);
            putchar(' ');
            putchar(' ');
            putchar(' ');
            putchar(' ');
        }
        putchar('
');}
        if(n2){for(i=0;i<16;i++)
        {
            if(line[i]=='
')
            {printf("0%-4x",'
');continue;}
	    if(line[i]=='	')
            {printf("0%-4x",'	');continue;}
            printf("%-5x",line[i]);
        }
        putchar('
');
        }

        if(n3){for(i=0;i<16;i++)
        {
            if(line[i]=='
')
            {printf("%-5d",'
');continue;}
	    if(line[i]=='	')
            {printf("%-5d",'	');continue;}
            printf("%-5d",line[i]);
        }
        putchar('
');
        }
        if(n4){for(i=0;i<16;i++)
        {
            if(line[i]=='
')
            {printf("%-5o",'
');continue;}
	    if(line[i]=='	')
            {printf("%-5o",'	');continue;}
            printf("%-5o",line[i]);
        }
        putchar('
');
        }
        printf("下一行!
");
	}
	j++;

    }
}

运行结果截图:

原文地址:https://www.cnblogs.com/Twe1vE/p/7672758.html