fork()函数

一.fork创建出的父子进程
1.有fork创建出来的新进程被称为子进程,该函数调用一次,但返回两次,其中父进程返回的是子进程的pid,子进程返回的是0。子进程可以通过调用getpid()来获取自己的pid,也可以调用getppid()来获取父进程的pid。
2.fork之后,操作系统会复制一个与父进程完全相同的子进程,虽然是父子关系,但这两个进程共享代码空间,但是数据空间是独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两个进程的程序计数器pc值相同,也就是说,子进程是从父进程返回出开始执行的),如果fork失败,父进程返回错误。
3.fork后两个进程执行的顺序由操作系统决定。

二、fork出的子进程和父进程的继承关系
fork出来的子进程,基本上除了进程号之外父进程的所有东西都有一份拷贝,子进程得到的只是父进程的拷贝,而不是父进程资源的本身。

由子进程自父进程继承到:
1.进程的资格(真实(real)/有效(effective)/已保存(saved)用户号(UIDs)和组号(GIDs))
2.环境(environment)
3.堆栈
4.内存
5.打开文件的描述符(注意对应的文件的位置由父子进程共享,这会引起含糊情况)
6.执行时关闭(close-on-exec) 标志 7.信号(signal)控制设定
7.nice值 (nice值由nice函数设定,该值表示进程的优先级,数值越小,优先级越高)
进程调度类别(scheduler class)(进程调度类别指进程在系统中被调度时所属的类别,不同类别有不同优先级,根据进程调度类别和nice值,进程调度程序可计算出每个进程的全局优先级(Global process prority),优先级高的进程优先执行)
8.进程组号
9.对话期ID(Session ID) (指:进程所属的对话期(session)ID, 一个对话期包括一个或多个进程组)
10.当前工作目录
11.根目录 (根目录不一定是“/”,它可由chroot函数改变)
12.文件方式创建屏蔽字(file mode creation mask (umask))(创建新文件的缺省屏蔽字)
13.资源限制
14.控制终端

子进程所独有:

进程号
1.不同的父进程号(即子进程的父进程号与父进程的父进程号不同, 父进程号可由getppid函数得到)
2.自己的文件描述符和目录流的拷贝(目录流由opendir函数创建,因其为顺序读取,顾称“目录流”)
3.子进程不继承父进程的进程,正文(text), 数据和其它锁定内存(memory locks)(锁定内存指被锁定的虚拟内存页,锁定后,4.不允许内核将其在必要时换出(page out))
5.在tms结构中的系统时间(译者注:tms结构可由times函数获得,它保存四个数据用于记录进程使用中央处理器 (CPU:Central Processing Unit)的时间,包括:用户时间,系统时间, 用户各子进程合计时间,系统各子进程合计时间)
6.资源使用(resource utilizations)设定为0
8.阻塞信号集初始化为空集
9.不继承由timer_create函数创建的计时器
10.不继承异步输入和输出

猜你喜欢

转载自blog.csdn.net/D_o_nlyone/article/details/81431417