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,,

运行结果:

QQ截图20130712154102

可知父子进程共享文件偏移指针,父进程写完后文件偏移到parent后子进程开始接着写。

相关内容