Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36745
  • 博文数量: 11
  • 博客积分: 265
  • 博客等级: 二等列兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-03 12:48
文章分类
文章存档

2012年(11)

我的朋友

分类: LINUX

2012-09-11 10:33:00

fork()函数最有趣,他只被调用一次,却返回两次:一次是在调用进程中,一次是在新创建的子进程中。在父进程中,返回子进程的PID,在子进程中,fork返回0

#include "csapp.h"

 int main()
 {
 pid_t pid;
 int x = 1;

pid = Fork();
 if (pid == 0) { /* Child */
printf("child : x=%d\n", ++x);
 exit(0);
 }

 /* Parent */
 printf("parent: x=%d\n", --x);
 exit(0);
 }

unix> ./fork
parent: x=0
child : x=2

  • 调用两次:返回一次:fork函数被父进程调用一次,却返回两次,一次返回到父进程,一次返回到新创建的子进程
  • 并发执行:父进程和子进程都是并发运行的独立进程,内核能够以任意的方式交替执行它们的逻辑控制流的指令,在上述代码中,先是父进程完成printf,再是子进程
  • 相同的但是独立的地址空间:每个进程的地址空间都是相同的,每个进程都有相同的用户栈、相同的本地变量值、相同的堆、相同的全局变量值,以及相同的代码 因为父进程和子进程都是独立的进程,它们都有自己的私有地址空间,父进程和子进程对x所做的改变都是独立的,不会反映到另一个进程的存储器中
  • 共享文件:父进程和子进程都把它们的输出显示在屏幕上,原因是子进程继承了父进程所有的打开文件。当父进程调用fork时,stdout文件是被打开的,并指向屏幕 子进程也继承这个文件,其输出也是指向屏幕的
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述的“副本”,这意味着父子进程间不共享这些存储空间。   
linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。 
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因为fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的
阅读(1123) | 评论(0) | 转发(0) |
0

上一篇:直接内存访问(DMA)

下一篇:Cache性能

给主人留下些什么吧!~~