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!\n");exit(1);}

    while(read(fd,&ch,1)!=0)
    {
        putchar(ch);
        if(ch == ‘\n‘){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 == ‘\n‘)
        count++;
    }
    return count;
}
void mh(int fd,int n)
{
    int count=0;
    char c;
    while (read(fd, &c, 1)!=0) {
           if (c==‘\n‘) {
           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;
}

运行截图:

原文地址:https://www.cnblogs.com/fyss/p/9905259.html

时间: 2024-10-10 23:16:04

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

20135223何伟钦—信息安全系统设计基础第六周学习总结

第四章:处理器体系结构 ISA指令集体性结构——处理器支持的指令和指令的字节编码 HCL硬件控制语言—描述处理器设计 Y86——定义一个指令集体系结构,包括定义各种状态元素.指令集和他们的编码.一组编程规范和异常事件处理. 一.Y86指令集体系结构 (一)程序员可见的状态 1.Y86程序 每条指令都会读取或修改处理器状态的某些部分 2.程序员 可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器. 3.处理器状态(类似于IA32) ①8个程序寄存器,%eax,%ecx,%edx,%ebx,

信息安全系统设计基础第六周学习总结-吕松鸿

第6章 存储器层次结构 6.1存储技术 6.1.1随机访问存储器 分为两类:静态(SRAM)和动态(DRAM). (1)SRAM:高速缓存存储器,既可以在CPU芯片上,也可以在片下. (2)DRAM:主存以及图形系统的帧缓冲区. 1.静态RAM SRAM将每个位存储在一个双稳态的存储器单元里.每个单元是用一个六晶体管电路来实现的.该电路有一个属性:可以无限期地保持在两个不同的电压配置或状态之一. 2.动态RAM 每位晶体管数 相对访问时间 持续的? 敏感的? 相对花费 应用 SRAM 6 1x

信息安全系统设计基础第六周学习总结

第六章 存储器层次结构 1.存储技术 三种常见存储技术:RAM/ROM/磁盘 (1)随机访问存储器RAM 两类:静态RAM(SRAM)和动态RAM(DRAM) 静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多. 静态RAM SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的. 这个电路的一个属性:它可以无限制地保持在两个不同的电压配置或状态之一.其他任何状态都是不稳定的. - 特点:由于SRAM的双稳态特性,只要有电,它就会永远地保持它的值,即使有

20135234马启扬-——信息安全系统设计基础第六周学习总结

处理器体系结构 4.1 Y86指令集体系结构 4.1.1程序员可见状态 Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态. 4.1.2 Y86指令 4个指令:irmovl,rrmovl,mrmovl,rmmovl,分别显示地指明源和目的的格式 4个整数操作指令:addl,subl,andl,xorl 7个跳转码指令jmp,jle,jl,jne,jge,jg 6个条件传送指令cmovle,cmovl,cmove,cmovge,cmovg call指令将返回地址入栈,然后

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

20145339《信息安全系统设计基础》第一周学习总结

20145339顿珠达杰<信息安全系统设计基础>第一周学习总结 ◆ Linux是一个操作系统.如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 物理机系统上可以通过使用[Ctrl]+[Alt]+[F1]-[F6]进行终端和图形界面切换,在线实验环境中按下[Ctrl]+[Alt]+[F7]来完成切换.普通意义上的 Shell 就是可以接受用户输入命令的程序,Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的

2017-2018-1 20155228 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

2017-2018-1 20155227 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155227 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 第六章 随机访问存储器 随机访问存储器分为:静态RAM(SRAM)和动态RAM(DRAM),静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多. (1)静态RAM SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的. 属性:它可以无限制地保持在两个不同的电压配置或状态之一.其他任何状态都是不稳定的. 特点:由于SRAM的双稳态特性,只要有电,它就会永

2017-2018-1 20155334 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155334 <信息安全系统设计基础>第九周学习总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 教材学习内容总结 一.常见的存储技术: 基本的存储技术包括随机存储器(RAM).非易失性存储器(ROM)和磁盘. 1. RAM分静态RAM(SRAM)和动态RAM(DRAM). 2. SRAM快些,主要用做CPU芯片上的高速缓存,也可以用作芯片下的

# 2018-2019-1 20165225《信息安全系统设计基础》第一周学习总结

2018-2019-1 20165225<信息安全系统设计基础>第一周学习总结 教材学习内容总结 vim的用法 命令行输入vimtutor即可随时查看: linux系统下文件的转换: gcc hello.c => 编译hello.c源程序,出现a.out文件 gcc -o hello hello.c => 编译hello.c源程序,出现hello文件 od -tc -tx1 hello.c => 按单字节查看文件内容 gcc -E hello.c -o hello.i =&g