登录 注册
当前位置:主页 > 资源下载 > 45 > \"Cadence入门教程中关于fork函数的讲解\

\"Cadence入门教程中关于fork函数的讲解\

  • 更新:2024-05-13 10:49:08
  • 大小:5.91MB
  • 推荐:★★★★★
  • 来源:网友上传分享
  • 类别:Unix - 操作系统
  • 格式:PDF

资源介绍

8.3 fork函数 一个现存进程调用 f o r k函数是U N I X内核创建一个新进程的唯一方法 (这并不适用于前节提 及的交换进程、 i n i t进程和页精灵进程。这些进程是由内核作为自举过程的一部分以特殊方式 创建的)。 #include #include pid_t fork(void); 返回:子进程中为0,父进程中为子进程I D,出错为-1 由f o r k创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次。两次返 回的区别是子进程的返回值是 0,而父进程的返回值则是新子进程的进程 I D。将子进程 I D返回 给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以 获得其所有子进程的进程 I D。f o r k使子进程得到返回值 0的理由是:一个进程只会有一个父进 程,所以子进程总是可以调用 g e t p p i d以获得其父进程的进程 I D (进程ID 0总是由交换进程使用, 所以一个子进程的进程I D不可能为0 )。 子进程和父进程继续执行 f o r k之后的指令。子进程是父进程的复制品。例如,子进程获得 父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这 些存储空间部分。如果正文段是只读的,则父、子进程共享正文段 (见7 . 6节)。 现在很多的实现并不做一个父进程数据段和堆的完全拷贝,因为在 f o r k之后经常跟随着 e x e c。作为替代,使用了在写时复制 ( C o p y - O n - Write, COW)的技术。这些区域由父、子进程共 享,而且内核将它们的存取许可权改变为只读的。如果有进程试图修改这些区域,则内核为有 关部分,典型的是虚存系统中的“页”,做一个拷贝。B a c h〔1 9 8 6〕的9 . 2节和L e ff l e r等〔1 9 8 9〕 的5 . 7节对这种特征做了更详细的说明。 实例 程序8 - 1例示了f o r k函数。如果执行此程序则得到: $ a . o u t a write to stdout before fork pid = 430, glob = 7, var = 89 子进程的变量值改变了 pid = 429, glob = 6, var = 88 父进程的变量值没有改变 $ a.out > temp.out $ cat temp.out a write to stdout before fork pid = 432, glob = 7, var = 89 before fork pid = 431, glob = 6, var = 88 一般来说,在 f o r k之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的 调度算法。如果要求父、子进程之间相互同步,则要求某种形式的进程间通信。在程序 8 - 1中, 父进程使自己睡眠 2秒钟,以此使子进程先执行。但并不保证 2秒钟已经足够,在 8 . 8节说明竟 争条件时,还将谈及这一问题及其他类型的同步方法。在 1 0 . 6节中,在f o r k之后将用信号使父、 1 4 2 U N I X环境高级编程