fork与fork函数

一个现有的进程创建一个新进程的唯一方法是调用fork与vfork函数。fork与vfork函数原型如下:

fork:

#include<unistd.h>

pid_t fork(void);


vfork:

#include<unistd.h>

#include<sys/types.h>

pid_t vfork(void);

正确返回:在父进程中返回子进程的进程号,在子进程中返回0

错误返回:-1

fork与vfork函数被调用1次,但返回两次。两次返回的区别是子进程返回值是0,父进程返回值则是子进程的pid。

子进程的id返回给父进程的理由是:因为,一个进程的子进程可以有多个,但是没有一个函数可以使一个父进程获得其所有子进程的进程id,所以父进程只有通过让子进程的id返回给父进程的这种方式使得父进程获得子进程的进程id。

子进程得到返回值0的理由是:

提问原因:

1.为什么子进程不返回其自己的进程id?

2.既然父进程有方法获得子进程的进程id,那么子进程如何获得其父进程的进程id呢?

3.为什么子进程非要获得返回值0,而不是其它值?

回答:

1.因为,父进程通过fork/vfork函数可以获得子进程的进程id,既然已经有获得子进程的进程id的方法了,也就没有必要再提供方法获得子进程的进程id;

2.一个进程只会有一个父进程,所以子进程可以通过调用getppid获得其父进程的进程id;

3.因为,这里已经要求子进程不要返回其进程id,因此为了使得子进程返回的值不会与子进程的进程id冲突,所以使用0作为其返回值,因为进程id0总是内核交换进程使用,所以一个子进程的进程id不可能为0,从而避免了冲突。

在调用fork/vfork返回后,子进程和父进程都从调用fork/vfork函数返回处开始执行。在此之后,fork与vfork函数将会产生差异:

fork函数:

       fork之后是父进程先执行还是子进程先执行是不确定的,父进程与子进程完全独立运行。如果要求父、子进程之间相互同步,则需要某种形式的进程通信机制。

       对于子进程,是父进程的副本,它获得了父进程的数据空间、堆和栈的拷贝。但是要注意,父、子进程并不共享这些存储空间,仅仅只是子进程对父进程存储空间的拷贝,父子进程各有自己的存储空间。但是,如果正文段是只读的话,则父、子进程将共享正文段。

      但是由于在fork函数之后经常跟随exec,所以很多实现并不执行对父进程的数据段、堆和栈段进行完全拷贝。作为替代,采用了写时复制技术(Cop-On-Write,COW),而让父、子进程共享这些区域,而且内核将它们的存取许可权改变为只读,只有当进程试图修改这些区域时,内核才为修改区域的那块内存制作一个副本,通常是虚拟存储器中的’‘一页‘’。

       用法:

(1)父进程希望复制自己,使父、子进程同时执行不同的代码段。例如,在网络服务进程中,父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求,父进程则继续等待下一个服务请求到达。

(2)一个进程要执行另外一个程序。这对shell是常见的情况。在这中情况下,子进程从fork返回后立即调用exec。当然,子进程在fork与exec之间可以更改自己的属性。例如I/O重定向、用户ID、信号安排等。

     文件共享:

??????

vfork函数:

      保证子进程先运行,父进程先挂起,在它调用exec函数或者exit函数之后父进程才被调度运行。(如果在调用这两个函数之前子进程依赖与父进程的进一步动作,则会导致死锁。)

     对于子进它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec函数或者exit函数,于是它不会存访该地址空间。但是,在子进程调用exec或exit之前,它在父进程空间运行,也就是说子进程与父进程共享数据段。

     用法:

用vfork创建的进程主要目的使用exec函数执行另外的程序,与fork的第二个用途相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪流之源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值