20145319 《信息安全系统设计基础》第十二周课后总结

20145319 《信息安全系统设计基础》第十二周课后总结

一 课后代码分析补充

exec1

  • 执行结果:从代码上来看,应该输出结果应该分成三部分,可实际上却少了最后一部分“ls -l is done, bye”

  • execvp函数int execvp(char *filename ,char * char str)函数会从PATH 环境变量所指的目录中查找符合filename的文件名,找到后便执行该文件,然后将第二个参数str传给该欲执行的文件,且调用execvp时,内核将新程序载入到当前进程,替代当前进程的代码和数据。

  • 代码中arglist[2]=0看似并没有作用,其实代表着执行ls -l的路径,若将其删除,则会报错“找不到文件路径”

  • 将其改为arglist[2]=".."则会列出父目录下各文件的具体属性

exec2

  • 执行结果和效果与exec1一致

exec3

  • 执行结果同上
  • execlp函数:大致同execvp函数相同,第一个参数为文件名,之后的字符当做该文件的argv,且同样会用新程序载入到当前进程,代替目前的代码和数据

forkdemo1

  • 执行结果

  • fork()函数fork函数会创建一个子进程,如果成功即返回子进程的pid,如果失败返回-1,与execvp函数不同,fork创建的进程并不会代替父进程,两个进程将都会运行结束,因此会输出两个after

forkdemo2

  • 执行结果(一个before,四个after)

  • fork建立进程的方式大概如下图,所以调用n个fork函数最后输出就会有2的n次方

forkdemo3

  • forkdemo3&forkdemo4都是与父子进程执行的先后顺序相关的函数,但其实父子程序谁先执行是随机,不确定的

psh1

  • 执行结果

  • 对于execvp函数的手动输入版,录入相关args之后,execvp函数将新程序载入到当前进程,替代当前进程的代码和数据,结束了循环

forkgdb

  • 执行结果

  • 说明:

    • 开始我以为sleep,那子进程会等待父进程,或者父等子,其实谁也没等谁,当一个进程在sleep时,另一个进程就会抢占执行;
    • 这也对应了之前forkdemo3的结果,父子进程谁先执行是不确定的,所以可以看到在一个进程休眠的那一秒,另一个进程在执行,并且进程之间相互独立互不干扰,也就是前文提到的相同的但是独立的地址空间这个特点

testbuf1

  • 执行结果

  • 若将fflush("stdout")删除,则无法输出hello

  • printf("str")只是将str输出到缓冲区,并非直接将其输出至屏幕,fflush(stdout)就是强制将缓冲区的内容输出出来,平时程序结束return 0即自带强制输出缓冲区内容,平时使用不留意缓冲区的细节并没有太大影响,但是在调用其他进程时,不注意缓冲区的细节就可能会带来一定麻烦

testbuf2

  • 执行结果同上
  • 可见pirntf("str ")中的 一样有强制输出缓冲区内容的功能

testbuf3

  • 执行结果

  • fprintf("1234")写在fprintf("abcd")之前最后的输出结果却是abcd1234,是因为printf(或fprintf)输出其实不是立马输出的,都是存在缓冲区里满足相应条件再输出。在这里,2句fprintf代码将输出内容分别指定到strerr和stdout,而strerr是无缓冲( unbuffered)的可以立马输出到终端,stdout是有缓冲(line-buffered)的,遇到换行或者缓冲区满再输出;所以此处优先在屏幕打印stderr的内容

  • 在两句fprintf之间加上flush(stdout)结果就是1234abcd

其他

  • 在学习exec1的时候,本来以为"arglist[2]"是用来指定执行路径的,后面发现是execvp函数要求传入的参数str必须要以NULL结尾,在执行psh1的时候也证实了,最后一个输入确实是NULL,但是为什么在我修改arglist[2]=".."时,却依然能够正常执行呢?而单纯删除掉arglist[2]=0时却显示是找不到路径?

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 20/20 学习常用linux命令
第二周 100/100 1/2 20/40 学习vim,gdb等用法
第三周 100/200 1/3 15/55
第四周 0/300 0/3 10/65
第五周 100/400 1/4 15/80 重温了汇编相关知识
第六周 0/400 1/5 15/95 学习了Y86
第七周 100/500 1/6 15/110 学习了存储器相关知识
第八周 0/500 2/8 20/130 复习
第九周 150/650 2/10 15/145 学习了I/O相关知识
第十周 300/950 2/12 20/165 学习了linux命令代码
第十一周 200/1150 3/15 20/185 学习了异常流相关知识
第十二周 200/1350 3/18 20/205 复习I/O,fork相关代码
原文地址:https://www.cnblogs.com/20145319zk/p/6130537.html