fork的数据是否共享
来源:互联网 发布:bangbangbangmv知乎 编辑:程序博客网 时间:2024/06/05 02:17
我们都知道fork的功能了,它可以创建一个新的进程,调用fork的进程,我们称为父进程,而新产生的进程,我们称为子进程。调用一次fork,有两个返回值,在父进程中返回子进程的PID,而在子进程中返回为0,调用失败,返回-1。我们知道fork之后子进程拷贝了父进程的PID,拷贝了父进程的代码内容,那我们都只子进程拷贝之后是从fork之后的下一条语句执行,因为计数器设置为了fork函数之后的下一条指令。这里我们留两个小问题:
1、程序计数器是怎样实现代码定位的。
2、代码段是真的拷贝了一份吗?
今天我们来解决的问题是,fork之后子进程和父进程的数据是否共享。我们可以写一份代码测试一下。
#include
#include
int global=10;
#include
int global=10;
int main()
{
int var=11;
int a=13;
int*p=(int*)malloc(sizeof(int));
p=&a;
printf("before fork data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
pid_t n=fork();
{
int var=11;
int a=13;
int*p=(int*)malloc(sizeof(int));
p=&a;
printf("before fork data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
pid_t n=fork();
if(n==0)
{
global++;
var++;
p=&var;
printf("child data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
else
{
sleep(3);
printf("father data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
{
global++;
var++;
p=&var;
printf("child data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
else
{
sleep(3);
printf("father data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
}
运行结果:
代码中我们测试了全局数据,存放在栈区的临时变量以及堆栈数据,可以发现在子进程中修改之后,父进程中看不到,可以得出结论父子进程的全局数据、栈区和堆栈是不共享。
阅读全文
0 0
- fork的数据是否共享
- 医疗界的大数据信息是否也能“共享”
- fork父子进程共享
- fork()----父子进程共享
- fork()后父子进程间的变量共享情况
- 进程调用fork与文件描述符的共享
- 进程调用fork与文件描述符的共享(fork,dump)
- 数据共享的方法
- 共享数据的保护
- 隐性数据的共享
- 如何判断fork之后的子进程是否已经结束
- 线程的数据共享和不共享
- fork mmap 共享映射区
- 如何知道自己的电脑是否共享
- 客户端的数据共享思路
- 基于XML的数据共享
- 数据共享的简单方法
- 灵活的共享数据结构设计
- 2017年河北省大学生程序设计竞赛 奇妙糖果屋 【二进制+异或】
- hibernate 懒加载问题
- 二维/多维vector在未知维度的前提下的赋值操作
- android开发之TabHost选项卡
- 克鲁斯卡尔最短路径算法详解
- fork的数据是否共享
- 2012.B组 方阵旋转
- golang-redis之sorted set类型简单操作
- linux鸟哥视频学习笔记02
- 开发环境的注意
- java新特性—泛型
- linux高性能服务器编程学习笔记一:TCP/IP协议详解
- SQL的Join使用图解教程
- linux版本分支