linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程
linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程
本节目标:
- 复制进程映像
- fork系统调用
- 孤儿进程、僵尸进程
- 写时复制
一,进程复制(或产生)
使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程ID和父进程ID不同
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。
二,fork系统调用
包含头文件 <sys/types.h> 和 <unistd.h>
函数功能:创建一个子进程
函数原型
pid_t fork(void); //一次调用两次返回值,是在各自的地址空间返回,意味着现在有两个基本一样的进程在执行
参数:无参数。
返回值:
- 如果成功创建一个子进程,对于父进程来说返回子进程ID
- 如果成功创建一个子进程,对于子进程来说返回值为0
- 如果为-1表示创建失败
流程图:
<unistd.h><stdlib.h>
ERR_EXIT(m) \
( main(=(pid == -(pid == (pid >
printf(
运行结果: <unistd.h><stdlib.h>
ERR_EXIT(m) \
( main(=(pid == -(pid == (pid >
以上程序跟前面那个基本一致,就是让父进程睡眠100秒,好让子进程先退出 运行结果: <unistd.h><stdlib.h>
ERR_EXIT(m) \
( main( val =
pid =(pid == -(pid == ++
printf((pid >
printf(
当调用fork时: 运行结果: <unistd.h><stdlib.h><fcntl.h>
ERR_EXIT(m) \
( main(= open((fd == -=(pid == -(pid == ,(pid >
write(fd,,
运行结果: 可知父子进程共享文件偏移指针,父进程写完后文件偏移到parent后子进程开始接着写。
评论暂时关闭