linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程

本节目标:

一,进程复制(或产生)

     使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

子进程与父进程的区别在于:

1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,网站空间,矛盾了)

2、各自的进程ID和父进程ID不同

3、子进程的未决告警被清除;

4、子进程的未决信号集设置为空集。

二,香港服务器,fork系统调用

包含头文件 <sys/types.h> 和 <unistd.h>

函数功能:创建一个子进程

函数原型

pid_t fork(void);  //一次调用两次返回值,是在各自的地址空间返回,服务器空间,意味着现在有两个基本一样的进程在执行

参数:无参数。

返回值:

流程图:

父进程调用fork()系统调用,然后陷入内核,进行进程复制,如果成功:

1,则对调用进程即父进程来说返回值为刚产生的子进程pid,因为进程PCB没有子进程信息,父进程只能通过这样获得。

2,对子进程(刚产生的新进程),则返回0,

这时就有两个进程在接着向下执行

如果失败,则返回0,调用进程继续向下执行

注:fork英文意思:分支,fork系统调用复制产生的子进程与父进程(调用进程)基本一样:代码段+数据段+堆栈段+PCB,当前的运行环境基本一样,所以子进程在fork之后开始向下执行,而不会从头开始执行。

示例程序:

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#define ERR_EXIT(m) \do\{\perror(m);\exit(EXIT_FAILURE);\}\while (0)\int main(void){pid_t pid;printf(,getpid());pid = fork();if(pid == -1)ERR_EXIT();if(pid == 0){printf(,getpid(),getppid());}if(pid > 0){//sleep(1);printf(,getpid(),pid);}return 0;}读书须用意,一字值千金。

linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程

相关文章:

你感兴趣的文章:

标签云: