#include <unisth.h>

pid_t fork(void)

fork函数被调用一次,返回两次。子进程的返回值是0,父进程的返回值是子进程的进程id。

fork函数调用一次却返回两次:向父进程返回子进程的ID,向子进程中返回0。这是因为父进程可能存在很多个子进程,所以必须通过这个返回的子进程ID来跟踪子进程;而子进程只有一个父进程,他的ID可以通过getppid取得。

子进程和父进程继续执行fork调用之后的指令,子进程是父进程的副本,子进程获得父进程数据空间、堆和栈的副本。注意:这是子进程所拥有的副本,父子进程并不共享这些存储空间部分。父子进程共享正文段

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h> int glob=;//全局变量,在堆中
char buf[]="a write to stdout\n"; int main()
{
int var;//局部变量,栈中
pid_t pid; var =;
if(write(STDOUT_FILENO,buf,sizeof(buf)-)!=sizeof(buf)-)
{
perror("write error");
}
printf("before fork:\n"); if((pid=fork())<)
{
perror("fork error");
}
else if(pid==)
{
glob++;
var++;
}
else{
sleep();
} printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);
exit();
}

输出:

a write to stdout
before fork:
pid=4989,glob=7,var=89
pid=4988,glob=6,var=88

fork的两种用法:

1.一个父进程希望复制自己,使父子进程同时执行不同的代码段

2.一个进程要执行一个不同的程序,在这种情况下,子进程从fork返回后立即调用exec

/* fork_test.c */
#include<sys/types.h>
#inlcude<unistd.h>
main()
{
pid_t pid; /*此时仅有一个进程*/
pid=fork();
/*此时已经有两个进程在同时运行*/
if(pid<)
printf("error in fork!");
else if(pid==)
printf("I am the child process, my process ID is %d/n",getpid());
else
printf("I am the parent process, my process ID is %d/n",getpid());
}

最新文章

  1. 1019: [SHOI2008]汉诺塔
  2. easyui datebox 扩展清空按钮及日期判断
  3. 购物车界面,不同section,点击增减物品,确定取消选中的逻辑判断
  4. C++数据结构之List--线性实现
  5. ERP_Oracle Erp发展趋势基于SOA电子商务方案
  6. 基于EasyUi的快速开发框架
  7. python处理Excel
  8. protel99与win7兼容问题的解决方案
  9. VS2010使整个过程说明了安装包
  10. 8. Python自定义模块humansize
  11. 裸二分图匹配poj1469
  12. spring bean之间关系
  13. 【机器学习】正则化的线性回归 —— 岭回归与Lasso回归
  14. mac上Pycharm个性化快捷键,类似Myeclipse的快速复制等快捷键
  15. 部署网站: 配置项目到iis上运行报目录错误
  16. MySQL开发设计规范
  17. python之连接oracle模块(cx_Oracle)
  18. JS中的可枚举属性与不可枚举属性以及扩展
  19. Python:Day06 元组、字典、字符串
  20. java⑧

热门文章

  1. docker 新手入门 (阿里镜像仓库的使用)
  2. H5里div多行显示省略号
  3. mysql创建新用户
  4. CF716E Digit Tree 点分治
  5. HUST软件与微电子学院第八届程序设计竞赛-小乐乐下象棋
  6. 5. COLUMNS
  7. linux秘钥分发
  8. Django框架基础知识07-常用查询及表关系的实现
  9. AGC 033
  10. Linux的常用shell命令技巧集