zoukankan      html  css  js  c++  java
  • 2018-2019 20165215 《信息安全系统设计基础》第六周学习总结

    2018-2019 20165215 《信息安全系统设计基础》第六周学习总结


    Linux系统调用学习

    操作系统(Operating System,简称OS)完成的工作比喻为两个角色:服务生和管家婆

    • 管家婆:
      • 通过「文件」对I/O设备进行了抽象
      • 通过「虚存」对主存和I/O设备进行了抽象
      • 通过「进程」对CPU、主存和I/O设备进行了抽象
    • 服务生:
      • GUI:为小白用户提供服务,你只会用鼠标就可以使用操作系统
      • Shell: 为高级用户提供服务,你要记忆系统命令,更多通过键盘使用操作系统
      • 系统调用:为专业用户程序员提供服务,你可以创建自己的工具让大家更好的使用操作系统

    两个重要命令:

    • man -k key1|grep key2|...根据关键字检索系统调用
    • grep -nr XXXX /usr/incldue查找相关的宏定义,结构体定义,类型定义等

    其它知识点

    • man -k +函数名搜索函数信息
    • man +数字+函数查到相关的命令和函数
    • cat+文件名称查看文本文件内容
    • od +文件名称查看二进制文件内容
    • SEE ALSO中得到相关系统调用的信息

    使用c语言实现who命令:

    系统级I/O

    • 输入/输出(I/O)是在主存和外部设备之间复制数据的过程
    • 文本文件是只含有ASCII或Unicode字符的普通文件;二进制文件是所有其他的文件。对内核而言,文本文件和二进制文件没有区别
    • 调用open函数来打开一个已存在的文件或者创建一个新文件的
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    int open(char *filename, int falgs, mode_t mode); 
    /*  成功则返回新文件描述符,出错返回-1;
        char *filename:函数将filename转换为一个文件描述符,并返回描述符数字;返回的描述符总是在进程中当前没有打开的最小描述符;
        int flags:指明进程打算如何访问这个文件;
        mode_t mode:指定了新文件的访问权限位。
    */
    
    • 调用close函数关闭一个打开的文件
    #include <unistd.h>
    
    int close(int fd);
    /*  成功则返回0,出错则为-1。 */
    
    • 通过分别调用read和write函数来执行输入和输出
    #include <unistd.h>
    
    ssize_t read(int fd, void *buf, size_t n);
    /* 成功则返回读的字节数,若EOF则为0,若出错则为-1。  */
    
    ssize_t write(int fd, const void *buf, size_t n);
    /*  成功则返回写的字节数,若出错则为-1。  */
    
    • 在x86-64系统中,size_t被定义为un-signed long,而ssize_t被定义为long
    • 内核用描述符表、文件表和v-node表这三个相关的数据结构来表示打开的文件;程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误,如果此时去打开一个新的文件,它的文件描述符会是3;不同的文件描述符也会指向同一个文件

    • 重定向的两种方式:
      • linux>ls>foo.txt使得shell加载和执行ls程序,将标准输出重定向到磁盘文件foo.txt
      • 使用dup2函数,复制描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd
      #include<unistd.h>
      
      int dup2(int oldfd,int newfd);
      /*返回,若成功则为非负的描述符,若出错则为-1*/
      

    head,tail的使用

    通过man headman tail查询可知head、tail的作用分别是显示一个文件的前十行和后十行

    一、伪代码:

    • head
    void main( ){
       计数标志 count=0;
        循环按字符读入文件
        {
            输出字符; 
            if(读入字符为回车符){cout++;}
            if(count==10){退出循环}
        }
    }
    
    • tail
    void main(){
        统计文件总行数n;
        计数标志 count=0
        循环按字符读入文件
        {
           if(读入字符为回车符){cout++;}
           if(count>=n-10){
               输出字符
           }
        }
    }
    

    二、产品代码

    • head
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main(int argc,char *argv[])
    {
    
        int count=0;
        char ch;
        int fd=0;
    
        fd=open(argv[argc-1],O_RDONLY,0);  
        if(fd==-1){printf("Error!
    ");exit(1);}
    
        while(read(fd,&ch,1)!=0)
        {
            putchar(ch); 
            if(ch == '
    '){count++;}
            if(count == 10){break;}
        }
    
        close(fd);
    
        return 0;
    }
    
    • tail
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int  ct(int fd)
    {
        int count=0;
        char c;
        while(read(fd,&c,1)!=0)
        {
           if(c == '
    ')
            count++;
        }
        return count;
    }
    void mh(int fd,int n)
    {
        int count=0;
        char c;
        while (read(fd, &c, 1)!=0) {
               if (c=='
    ') {
               count++;
               }
               if (count>=n-10) {
               putchar(c);
               }
        }
    }
    int main()
    {
        int fd=0,ft=0;
        int count;
        fd=open("aaa.txt",O_RDONLY);
        count=ct(fd);
        close(fd);
        ft=open("aaa.txt",O_RDONLY);
        mh(fd,count);
        close(ft);
        return 0;
    }
    

    运行截图:

  • 相关阅读:
    webpack打包代码生成npm包和js文件学习记录
    王道每周工作记录
    20211116 nuxt项目移动端网页修复记录
    ubuntuwireshark打开出现错误的问题
    Python3基础使用RSA2(SHA256WithRSA)签名加密作为sign值的问题
    博客成长志
    OI学习日志 12月份
    docker 运行.net镜像服务运行正常但是连接不上sqlserver数据库解决方案
    国外一位Orchard的blog
    mvc 相关联的下拉列表 cascading dropdownlist
  • 原文地址:https://www.cnblogs.com/fyss/p/9905259.html
Copyright © 2011-2022 走看看