APUE-8-进程控制之Fork
最近又在回顾进程的Fork知识,然后手头又有APUE,悔恨大学没有看这样的书;在进程Fork时,将会返回两次,返回值为0的为子进程,用getppid()获取的是父进程的pid;返回值为进程id(子进程的)的是父进程,getppid返回的是自己的pid。
父子进程共享继承的是:
- 实际用户ID,实际组ID,有效用户ID,有效组ID,附属组ID
- 进程组ID
- 会话ID
- 文件偏移量
- 控制终端
- 目录等环境变量
- 信号屏蔽和安排
- 连接的共享存储段
- 存储镜像、资源限制
父子进程不同的是:
- fork返回值
- 进程ID不同
- 子进程的tms_utime, tms_stime, tms_cutime, tms_cstime的值为0
- 子进程不继承父进程的文件锁
- 子进程的未处理闹钟会被清除
- 子进程的未处理的信号寄清空
fork之后对于文件描述符有以下两种处理方式:
- 父进程等待子进程完成。父进程无需对文件描述符做任何处理,子进程结束后,父进程的文件描述符的偏移量以做相应更新;
- 父进程和子进程执行不同程序段。这种情况下,fork之后,父子进程会关闭各自不需要使用的文件描述符(网络服务常用)。
fork用在两种用法:
- 父进程希望子进程复制自己,但是去执行不同的代码段,常见于网络服务:父进程负责监听信号,子进程负责处理请求;
- 一个进程要执行另一个不同程序,最常见shell:进程fork后立即调用exec执行其他程序。
Linux 之后弄出一个clone, 就是可以在fork时可以自己设定需要共享不共享的数据,然后fork应该是在clone的一个实现(猜)。
附: