在牛客做题时遇到了这样一个问题:
int main(){fork()||fork();}共创建几个进程:_
回想之前一直在这里跌倒从来没有爬起来过的经历,痛定思痛,来好好的思考了一下fork()函数的使用
fork函数初识
在linux中fork函数是非常重要的函数,它从已经存在的进程中创建一个新进程。新进程为子进程,而原进程为父进程。
1 |
|
进程调用fork,当控制转移到内核中的fork代码后,内核会做这样的操作:
- 分配新的内存块和内存数据结构给子进程
- 将父进程部分数据结构内容拷贝到子进程中
- 添加子进程到系统进程列表中
- fork返回,开始调度器调度
当一个进程调用fork后,就会有两个二进制代码相同的进程,而且他们都运行到相同的地方。
注意:fork后父进程还是子进程先执行决定于调度器
fork调用失败的原因
- 系统中有太多进程
- 实际用户的进程数超过了限制
fork常规用法
- 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求
- 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数
子进程继承父进程
使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程ID和父进程ID不同
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。