信息安全系统设计基础第十二周学习总结
-
指针数组
是数组,数组里的元素是指针
int *daytab[13]
数组指针
是指针,指向一个类型和元素个数都固定的数组
int (*daytab1)[13]
指针函数
是函数,返回值类型是指针
int *comp()
函数指针
是指针,指向函数的指针,函数名就是函数指针
int (*comp1)()
右左右左法
每次分析不要跨过括号,位于右边的小括号和中括号具有更高的优先级。
1.数组一定要告诉元素个数和数据类型
2.函数一定有形参和返回值类型
3.数组指针,函数指针,*和指针要括起来。
分析: - char ((x())[])()
简化: -
typedef char (f)();
typedef f g[];
x可以简化为g x(),所以x是一个返回值指向g类型的指针的函数。
g是一个指针数组,数组内的元素都是指针,指针的类型是一个返回值为char的函数指针。
- char ((x[3])())[5]
简化为char (*A)[5],这是一个数组指针,指向一个有五个char型元素的数组
A是(*x[3])(),相当于(*B)(),这是一个函数指针,指向函数B
B是x[3],是一个数组。
exec1 |
execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。 |
exec2 |
它与exec1的区别就在于exevp函数的第一个参数,exec1传的是ls,exec2直接用的arglist[0],不过由定义可得这两个等价,所以运行结果是相同的。 |
exec3 |
这个代码指定了环境变量,然后依然执行了ls -l指令,成功后没有返回,所以最后一句话不会输出。运行结果同exec1. |
exec1
exec2
exec3
forkdemo1 |
这个代码先是打印进程pid,然后调用fork函数生成子进程,休眠一秒后再次打印进程id,这时父进程打印子进程pid,子进程返回0. |
forkdemo2 |
这个代码调用两次fork,一共产生四个子进程,所以会打印四个aftre输出。 |
forkdemo3 |
fork产生子进程,父进程返回子进程pid,不为0,所以输出父进程的那句话,子进程返回0,所以会输出子进程那句话。 |
forkdemo1 forkdemo2 forkdemo3
forkdemo4
forkgdb | 父进程打印是先打印两句,然后休眠一秒,然后打印一句,子进程先打印一句,然后休眠一秒,然后打印两句。并且这两个线程是并发的,所以可以看到在一个线程休眠的那一秒,另一个线程在执行,并且线程之间相互独立互不干扰。 |
forkgdb
psh1 psh2
testbuf1 |
效果是先输出hello,然后换行。之后不退出。 |
testbuf2 |
效果同上。 |
testbuf3 | 将内容格式化输出到标准错误、输出流中。 |
testbuf : testbuf1 testbuf2 testbuf3
testpid |
输出当前进程pid和当前进程的父进程的pid。 |
testpp | |
testsystem | system()——执行shell命令,也就是向dos发送一条指令。这里是后面可以跟两个参数,然后向dos发送这两个命令,分别执行。如下图,输入ls和dir两个指令后,可以看到分别执行了。 |
testpid testpp testsystem
waitdemo1 |
如果有子进程,则终止子进程,成功返回子进程pid。结果如下图: |
waitdemo2 |
这个比起1来就是多了一个子进程的状态区分,把状态拆分成三块,exit,sig和core。具体运行如下: |
waitdemo1 waitdemo2
参考资料:
1.百度百科
2.man , grep
3.20135302博客
学习体会:这次代码较多,逐个运行,不能说完全吃透,但是在网上和同学博客上的注释下,看懂了一些。