进程管理--fork函数

A.   进程的概念
进程是正在运行的程序实体,并且包括这个运行的程序中占据所有系统资源。
在Linux系统中,触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。
了解进程,其实借助于程序更好理解。程序一般是放置在磁盘中,然后通过用户的执行来触发。触发后会加载到内存中成为一个个个体,那就是进程。因此进程又被定义为“ 具有一定独立功能的程序关于某个数据集合上的一次运行活动”。

B.   进程的内存映像
进程的内存映像(如图)是指内核在内存中如何存放可执行程序文件。在将程序转化为进程的过程中,操作系统将可执行程序由硬件复制到内存中。
从内存的低地址到高地址依次如下:
代码段:即二进制机器代码,代码段是只读的,可被多个进程共享。
数据段:存储已被初始化的变量,包括全局变量和已被初始化的静态变量。
未被初始化数据:存储未被初始化的静态变量,它也被称为bss段。
堆:用于存放程序运行中动态分配的变量。
栈:用于函数调用,保存函数的返回地址,函数的参数,函数内部定义的局部变量。

C.  主题“进程的创建--fork函数”
fork函数:创建当前进程的一份拷贝,当前进程叫做父进程,新进程则称为子进程。
下面我们来看一段代码:

由上面的程序,我需要陈述以下几个方面:
1> fork函数的返回值
     fork函数比较特殊,他执行成功会有两个返回值:在父进程返回子进程ID,在子进程返回0。因此可以利用返回值等于0,判定该进程为子进程;返回值为大于0的数,判定该进程为父进程。在fork创建进程失败时,返回值只有一个即-1。
2> fork出错原因
  当前进程数已经达到了系统规定的上限,这时error值被设置为EAGAIN;
     系统可供使用的内存不足,这时error值被设置为ENOMEM。
3> 父子进程执行顺序
     创建进程成功后,系统中出现了两个基本完全相同的进程,这两个进程无固定先后顺序,哪个进程先执行      取决于内核所使用的调度算法。
4>  前几天在学习过程中,我在网页上看到下面这样一段话,感觉挺不错的,在这里与大家分享:
       关于“fork的返回值pid为什么在父子进程中不同”。"其实就相当于链表,进程形成了链表,父进程的pid(p意味着point)指向子进程的进程ID,因子进程没有子进程,所以其返回pid为0"。

D.  附注信息
几个特殊进程名称:
      僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然存在系统中。这个进程又称为僵死进程。
       孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将由init进程(进程号为1)所养,并由init进程对它们完成状态收集工作。
几个特殊进程ID:
       ID为0,是调度进程【又叫交换进程,swapper】,内核的一部分,不执行磁盘上的程序。
       ID为1,是init进程,在在自举过程结束时,由内核调用。此进程的程序文件旧版本是/etc/init,新版本是/sbin/init。
       ID为2,是页守护进程,支持虚拟存储系统的分页操作。

  注:以上内容均是在本人这周初步学习进程中,从《鸟哥》与《C编程实战》以及百度等方式所获得的一些知识。谢谢阅读。点击打开链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值