20145326蔡馨熠《信息安全系统设计基础》第12周学习总结

20145326蔡馨熠《信息安全系统设计基础》第12周学习总结

教材学习内容总结

视频学习与实践

指针与声明

C语言中变量的声明包括两个部分:

  • 类型
  • 声明符

对于简单类型,声明并不会对代码产生多大的阅读障碍,而对于复杂类型的识别,可以采用右左右左法进行判断。

指针数组、数组指针、指针函数、函数指针的区别

数组指针(也称行指针)

定义 int (*p)[n];

  • ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
  • 如要将二维数组赋给一指针,应这样赋值:

    int a[3][4];
    int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

    p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
    p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组

定义 int *p[n];

  • []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
  • 如要将二维数组赋给一指针数组:
    int *p[3];
    int a[3][4];
    p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
    for(i=0;i<3;i++)
    p[i]=a[i]

这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2] 所以要分别赋值。

  • 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
  • 还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
  • 比如要表示数组中i行j列一个元素: (p[i]+j)、(*(p+i)+j)、((p+i))[j]、p[i][j],优先级:()>[]>

函数指针

  • 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这个函数.我们把这种指向函数的指针变量称为“函数指针变量”.
  • 函数指针变量定义的一般形式为:

类型说明符 (*指针变量名)();

  • 其中“类型说明符”表示被指函数的返回值的类型.“(* 指针变量名)”表示“”后面的变量是定义的指针变量.最后的空括号表示指针变量所指的是一个函数.
    例如: int (pf)();
    表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型.

指针函数

  • 函数类型是指函数返回值的类型.在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数.
  • 定义指针型函数的一般形式为:
    类型说明符 函数名(形参表) 

    …… /函数体*/
    }
  • 其中函数名之前加了“”号表明这是一个指针型函数,即返回值是一个指针.类型说明符表示了返回的指针值所指向的数据类型.
    如:
    int ap(int x,int y) {
    ./函数体/
    }
    表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量.

右左右左法

  • 具体方法:

1.从变量名开始,先右再左地,交替地一个一个向外看,在纸上写下:“变量是”

2.若向右遇到左圆括号,在纸上写下:“函数,参数是”,并用同样的方法处理括号中每一个参数——在纸上写下:“返回”

3.若向右遇到方括号,在纸上写下:“数组,长度为{方括号的内容},元素类型为”

4.若向右遇到右圆括号,什么也不做

5.若向左遇到*,在纸上写下:“指针,指向”

6.若向左遇到任何类型,在纸上写下对应的类型名

信号的产生

  • 由用户产生,如:Ctrl+C产生SIGINT信号等,可以通过stty -a查看哪些按键可以产生信号
  • 由硬件产生,如:当前进程执行了除以0的指令
  • 由进程发送,如:可在shell进程下,使用命令 kill -信号标号 PID,向指定进程发送信号。
  • 由内核产生,如:闹钟超时产生SIGALRM信号。

信号的三种处理方式:

  • 忽略
  • 默认处理方式:操作系统设定的默认处理方式
  • 自定义信号处理方式:可自定义信号处理函数

捕捉信号

  • 利用命令man -k signal进行检索相关函数:

  • sigdemo1.c运行结果如下图所示:

  • 分析:signal函数每次设置具体的信号处理函数(非SIG_IGN)只能生效一次,每次在进程响应处理信号时,随即将信号处理函数恢复为默认处理方式

忽略信号

  • sigdemo2.c运行结果如下图所示:

  • 查看SIG_IGN宏变量:

  • 由图可知,SIG_IGN是忽略信号的处理程序,表示无返回值的函数指针,指针值为1.

默认信号

  • 查看SIG_DFL宏变量:

  • 由图可知,SIG_DFL是默认信号的处理程序,表示无返回值的函数指针,指针值为0
  • sigdemo2.c代码如下所示:

  • 如果把SIGIGN改成SIGDFL时,运行结果变成如下所示

  • 分析:SIG_IGN是忽略信号,也就是当键盘输入一个Ctrl+C中断指令时,程序会将其忽略,而改成SIG_DFL后,恢复成了默认的状态,输入中断指令后,自然程序也就中断了。

signal与sigaction区别

signal的问题:

  • 不知道信号被发送的原因
  • 信号处理过程中不能安全地阻塞其他信号

sigaction的问题:

  • 在信号处理程序被调用时,系统建立的新信号屏蔽字会自动包括正被递送的信号。因此保证了在处理一个给定的信号时,如果这种信号再次发生,那么它会被阻塞到对前一个信号的处理结束为止
  • 响应函数设置后就一直有效,不会重置

结合signal实现sleep()函数的功能

sleep()的实现应该分为三步:

  • 注册一个信号signal(SIGALRM,handler)。
  • 调用alarm()函数。
  • pause()挂起进程。

心得体会

本周主要学习了视频内容,复习了第九、十、十一周的代码。我发现好多东西虽然学过了,但是过段时间就会忘记,所以复习是很必要的!之前由于每周的学习任务都比较重,所以有些代码没有更细致的去理解分析,这周的时间正好可以拿来复习巩固之前学过的东西,正所谓“温故而知新,可以为师矣”,通过不断温习,之前的基础也会更加扎实!

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时  
第一周 0/0 1/2 20/20  
第二周 58/58 1/3 20/40  
第三周 150/208 1/4 22/62  
第五周 150/358 1/5 21/83  
第六周 136/494 1/6 25/108  
第七周 115/609 2/8 24/132  
第八周 0/609 2/10 22/154  
第九周 109/718 3/13 20/174  
第十周 472/1190 1/14 21/195  
第十一周 1883/3073 3/17 21/216  
第十二周 0/3073 2/19 20/236  
时间: 2024-12-26 21:14:06

20145326蔡馨熠《信息安全系统设计基础》第12周学习总结的相关文章

20145326蔡馨熠《Java程序设计》第一周学习总结

20145326蔡馨熠 <Java程序设计>第一周学习总结 教材学习内容总结 转眼间新的一学期终于开始了!为什么我这么期待呢?因为这学期可以上娄嘉鹏老师的java程序设计课,我不是什么电脑天才,之前c语言学得也不是特别好.可我就是对hdl和java特别感兴趣(之前在我的问卷调查报告里面提到过),并且寒假的时候在家里也预习了一部分java知识.第一周要求学习两个章节并作心得体会,虽然我早已看过前两章的知识,不过为了进一步巩固,我还是用了星期六一天的时间把第一章和第二章的知识从头到尾仔仔细细的看了

20145309信息安全系统设计基础第12周学习总结后篇

指针与声明 声明 1.C语言中变量的声明 类型(type) 声明符(declarator) 2.最简单的声明是变量 3.指针数组 指针数组是一个数组 数组里的元素都是指针 例:int *daytab[13] 4.数组指针 数组指针是一个指针 指针指向一个类型和元素个数都固定的数组 例:int (*daytab1)[13] 5.指针函数 指针函数是函数 函数的返回值是指针类型 例:int *comp() 6.函数指针 函数指针是指针 指针指向函数 函数名就是函数指针 例:int (*comp1)(

信息安全系统设计基础 第12周学习笔记

第八章代码 exec1: execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件.如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中.在结果中我们可以看出exevp函数调用成功没有返回,所以没有打印出“* * * ls is done. bye”. exec2: exec1的区别就在于exevp函数的第一个参数,exec1传的是ls,exec2直接用的arglist[0],不过由定

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

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

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

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

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

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

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

20145311 <信息安全系统设计基础>第二周学习总结 教材学习内容总结 重新学习了一下上周的一部分命令:grep main wyx.c(grep的全文检索功能)ls > ls.txt :ls内容输出到文本find pathname -mtime -n/+nfind -size -n/+n (find的功能还是比较强大) 简单地学习了一下vim编辑器,跟着vimtutor简单地学了一些,在linux bash中使用vim能够极大地提高效率, vim的用法比较多,只学习了其中简单的一部分

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 20155332 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155332 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 简单模型中,存储器是一个线性的字节数组.真实模型中,是一个具有不同容量,成本,访问时间的存储层次结构(存储器山) 程序的局部性很重要,对程序性能有很重要的影响. 计算机系统一个基本而持久的思想,如果你理解了系统是如何将数据在存储器层级结构中上下移动,你就可以编写程序,让数据存储在层次结构中较高的地方,从而CPU可以更快的访问到他们. 编写程序实现功能是最简单的,如何让编写的程序拥有最高的性能,例