zoukankan      html  css  js  c++  java
  • # 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++;
    
        }
    }
    

    运行结果截图:

  • 相关阅读:
    文件读写和进度条
    复选框选择变化(可以演化成简单的字符串拼接)
    读取文本方式的简单登录
    计算字符出现次数
    判断系统版本号
    DataTable合并
    获取单元格值的数据类型
    struts2 日期标签
    jsp获取枚举的值
    java web项目修改项目名称
  • 原文地址:https://www.cnblogs.com/Twe1vE/p/7672758.html
Copyright © 2011-2022 走看看