关于fork和操作系统一些知识
- A: 牛客网刷计算操作系统的题,遇到一个一直很模糊的题,所以记录下来。
题目是:
main{
fork() || fork()
}
共创建了(3)个进程
解释是:
fork()给子进程返回一个零值,而给父进程返回一个子进车id;在main这个主进程中,首先执行 fork() || fork(), 左边的fork()返回一个非零值,根据**||的短路原则**,前面的表达式为真时,后面的表达式不执行,故包含main的这个主进程创建了一个子进程,由于子进程会复制父进程,而且子进程会根据其返回值继续执行,就是说,在子进程中, fork() ||fork()这条语句左边表达式的返回值是0, 所以||右边的表达式要执行,这时在子进程中又创建了一个进程,即main进程->子进程->子进程,一共创建了3个进程。
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,
也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都
复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
- B: 使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括**:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端**等。
子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程ID和父进程ID不同
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。
-
C: 用户态切换到内核态的 3 种方式
a. 系统调用
b. 异常
c. 外围设备的中断
- D: 附加:局域网的网络地址192.168.1.0/24,局域网络连接其它网络的网关地址是192.168.1.1。主机192.168.1.20访问172.16.1.0/24网络时,其路由设置正确的是?
参考学习链接来自–博客园: http://www.cnblogs.com/bastard/archive/2012/08/31/2664896.html