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\n")
中的\n
一样有强制输出缓冲区内容的功能
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相关代码 |
posted on 2016-12-04 21:53 20145319钟轲 阅读(108) 评论(1) 编辑 收藏 举报