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

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

    教材学习内容总结

    系统调用文件读写常用函数
    open()函数
    功能: 打开设备文件
    原型:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int open(const char *pathname, int flag);
    

    说明: 利用flags指定的属性打开表示pathname上指定字符的设备文件。通常,pathname上指定的
    位置为"/dev/"目录中的设备文件。
    变量: pathname 指定设备文件字符的地址
    flags 指定接近设备文件的属性:
    _O_RDONLY 以只读方式打开文件
    _O_WRONLY 以只写方式打开文件
    _O_RDWR 以可读可写方式打开文件
    _O_NOCTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机
    _O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返
    回进程之中
    _O_NDELAY 以不可阻断的方式打开文件
    _O_SYNC 以同步的方式打开文件,设备上写入的内容记录到硬件之前,呼叫进程处于
    阻断状态
    返回值: 若成功打开文件,则返回文件描述符,失败则返回-1值。若所有欲核查的权限都通过了检查则
    返回0值,表示成功,只要有一个权限被禁止则返回-1。得到-1值时参考errno,可以确定实际
    设备驱动程序中返回的值。

    错误代码
    -ENXIO 文件为设备文件,但是没有相应的设备
    -ENODEV 不存在设备文件相关的设备驱动程序或硬件
    -ENOMEM 核心内存不足
    注:下面这一段是关于open函数的另一个参数,上面没有讲解到,不过细读这段话,我有很大的问题,按着上面说的,那read该怎么读,啥时候不都是读不到了
    O_APPEND的含义是在每次写之前,都讲标志位移动到文件的末端。表面上读这句话可能会有误解,提出一个问题:当在O_APPEND打开后,然后用 lseek移动到其他的位置,然后再用write写,这个时候,请问你数据写到哪里去了?是在末端,还是lseek移动到得位置。答案是在末端,因为 O_APPEND打开后,是一个原子操作:移动到末端,写数据。这是O_APPEND打开的作用。中间的插入时无效的。例如 : int fd = open("test.txt",RDWR O_APPEND); lseek(fd,10,SEEK_SET); if(write(fd,buffer,strlen(buffer)) !=strlen(buffer)){ perror("write error"); exit(1); } read(fd,buffer,20);这里lseek是没有用的,write的写入是到末端的。在write写完后,标志位是在文件末端的,这个时候的读是不会读的,所以以前的lseek是没有用的,除非你读之前再lseek一次。 这里的read讲不会读出 任何数据,因为在末尾。它还是保持原来的写入的数据。2 在read读出数据的时候,要明白一个问题。read读出的数据大部分情况下,不是以0结尾的。这样就造成了一种情况,你要输出读出数据的时候,就会出现问题,因为puts,printf函数都是以0作为输出结束符的。就出出现前面的字符是你想看到的,后面的大部分是乱码.而对于fgets等函数,会在末尾自动加0

    close()函数
    功能: 关闭设备文件
    原型:

    #include <unistd.h>
    int close(int fd);
    

    说明: 为了打开设备文件,关闭open()函数返回的文件描述符fd相应的设备文件。
    变量: fd open()函数运行结果返回的文件描述符
    返回值: 成功关闭则返回0,失败则返回-1。

    read()函数
    功能: 由设备文件读取数据
    原型:

    # include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
    

    说明: read()函数会把参数fd所指向的设备文件传送count个字节到buf指针所指的内存中。此时count
    值应小于SSIZE_MAX。open()函数没有指定为O_NONBLOCK或O_NDELAY时,阻断到可读取相应计数
    值的大小。设备文件的设备驱动程序没有体现O_NONBLOCK或O_NDELAY时,没有指定相应的选项
    也有可能被阻断。原则上这是错误的设备驱动程序。创建程序时,也要对比上述情况,因此必
    须确认返回的结果。此外文件读写位置会随读取大的字节移动。
    变量: fd 由open()函数运行结果返回的描述符
    buf 存储读取数据的空间位置。该存储空间应大于计数字节
    count 设备文件中读取的数据大小。该值应小于SSIZE_MAX。返回值为0,立即终止运行
    返回值: 设备文件正常读取里数据后,返回读取的字节数。即使该值小于相应的字节数,也不是错误。几
    乎没有实际可用的字节数或被中断信号时发生上述现象。如果失败则返回-1,得到-1值时参考errno
    ,可以确认实际设备驱动程序中的返回值。

    错误代码:
    -EINTR 此调用被信号所中断
    -EAGAIN 当使用不可阻断(O_NONBLOCK)打开文件后,read呼叫无可读取的数据
    -EIO 设备文件读取数据是发生输入输出错误
    -EBADF 参数fd非有效文件描述符,或该文件已关闭
    -EINVAL fd连接到不合适读取的对象上
    -EFAULT 参数buf为无效指针,指向无法存在的空间

    write()函数
    功能: 将数据写入设备文件内
    原型:

    # include <unistd.h>
    ssize_t write(int fd, const void* buf, size_t count);
    

    说明: write()函数会把参数buf所指的内存中的count个字节写入到参数fd所指的文件内。此时count
    值应小于SSIZE_MAX。open()函数没有指定为O_NONBLOCK或O_NDELAY时,阻断到可读取相应count
    值的大小。设备文件的设备驱动程序没有体现O_NONBLOCK或O_NDELAY时,没有指定相应的选项
    也有可能被阻断。原则上这是错误的设备驱动程序。创建程序时,也要对比上述情况,因此必
    须确认返回的结果。文件指针的位置会随之移动相应的字节数。
    变量: fd 由open()函数运行结果返回的描述符
    buf 存储写入数据的空间位置。该地址所指的存储空间应大于count字节
    count 设备文件中要写入数据的大小。该值应小于SSIZE_MAX。返回值为0则立即中断
    返回值: 设备文件正常写入数据后,返回写入的字节数。即使该值小于相应的必要字节数,也不是错误。
    可能没有写入实际需要的字节数,或被某种信号中断了。如果失败则返回-1,得到-1值时参考
    errno,可以确认实际设备驱动程序中的返回
    错误代码
    -EBADF 参数fd非有效的文件描述符,或该文件没有处于可写状态
    -EINVAL fd连接到不适合写入的对象上
    -EFAULT 参数buf为无效指针,指向无法存在的空间
    -EAGAIN 虽然使用不可阻断(O_NONBLOCK)打开了文件,但是没有处于read呼叫后可直接处理的状态
    -EINTR 写完数据前,此调用被信号中断
    -ENOSPC 包含fd文件的设备上不存在相应的数据空间
    -EIO 设备文件写入数据的过程中发生了输入输出错误

    教材学习中的问题和解决过程

    • 问题1:文件描述符与句柄的关系
    • 问题1解决方案:文件描述符是linux中的概念,句柄是Windows中的概念,Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件。标准C中每个进程默认打开的有三个文件,标准输入,标准输出,标准错误,分别用一个FILE结构的指针来表示,即stdin,stout,sterr,这三个结构分别对应着三个文件描述符0,1,2。

    文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。linux 操作系统通常对每个进程l能打开的文件数量有一个限制。

    linux系统默认的最大文件描述符限制是1024

    代码调试中的问题和解决过程

    • 问题1:段错误(核心已转储)
    • 问题1解决方案:改正数组越界错误

    [代码托管]

    myod(系统调用版)

    main.c:

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include"sys/syscall.h"
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<string.h>
    int main(int argc,char *argv[])
    {
    
            int sec;
            int readfile;
            int result;
            int count=0;
            char ch;
            char str[16];
            int i=0,j;
            if((sec = open(argv[1],O_RDONLY))==-1)
            {
                    printf("Failure to open %s !
    ",argv[0]);
                    exit(0);
            }
            while((readfile=read(sec,str,16)))
            {
                            printf("%07o",count);
                            for(i=0;i<readfile;i++)
                            printf("  %02x",str[i]);
                            printf("
    ");
                            printf("       ");
                            for(j=0;j<readfile;j++)
                            if(str[j]=='
    ')
                            printf("  \n");
                            else
                            printf("%4c",str[j]);
     						printf("
    ");
                            count+=readfile;
            }
            printf("%07o ",count);
            printf("
    ");
            result=close(sec);
            return 0;
    }
    
    

    myhead
    main.c:

    #include"head.h"
    #include<stdio.h>
    #include<fcntl.h>
    #include<string.h>
    #include<unistd.h>
    
    int main(int argc,char *argv[])
    {
            int f1;
            int row_count=0;
            int size;
            char ch[4096];
            if((f1=open(argv[2],O_RDONLY))==-1)
            {
                    printf("Failure to open file %s",argv[2]);
                    exit(0);
            }
            size=read(f1,ch,4096);
            close(f1);
            if(strcmp(argv[1],"head")==0)
            head(ch,size);
            else if(strcmp(argv[1],"tail")==0)
            tail(ch,size);
    return 0;
    }
    
    

    head.h:

    #ifndef HEAD_H
    #define HEAD_H
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void head(char ch[],int size_t);
    void tail(char ch[],int size_t);
    #endif
    
    

    head.c:

    #include<stdio.h>
    void head(char ch[],int size_t)
    {
            int count=0;
            int i;
            for(i=0;i<size_t;i++)
            {
                    if(ch[i]=='
    ')
                    count++;
                    if(count==10)
                    break;
                    printf("%c",ch[i]);
            }
    }
    

    tail.c:

    #include<stdio.h>
    tail(char ch[],int size_t)
    {
            int i;
            int count=0;
            for(i=size_t;i>0;i--)
            {
                    if(ch[i]=='
    ')
                    count++;
                    if(count==10)
                    break;
            }
            for(i--;i<size_t;i++)
            {
                    printf("%c",ch[i]);
            }
    }
    

    代码托管

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 6/6 1/1 20/20
    第一周 117/123 1/2 5/25

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:XX小时

    • 实际学习时间:XX小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    jQ插件开发规范(转)
    一个圆环形状的进度条。
    [转载]jQuery 图表插件 jqChart 使用
    作业.mp4
    嘣嘣嘣嘣嘣哥TnT
    我对GIT的认识`
    git的理解
    文章读后感
    团队作业7
    团队作业6
  • 原文地址:https://www.cnblogs.com/20155222lzj/p/7675166.html
Copyright © 2011-2022 走看看