fork的数据是否共享

fork父子进程共享 fork之后,子进程拷贝进程数据空间、堆和栈空间(实际上是采用写时复制技术),二者共享代码段。 所以在子进程中修改全局变量(局部变量,分配在堆上的内存同样也是)后,父进程的相同的全局变量会改变。 阅读详情
我们都知道fork的功能了,它可以创建一个新的进程,调用fork的进程,我们称为父进程,而新产生的进程,我们称为子进程。调用一次fork,有两个返回值,在父进程中返回子进程的PID,而在子进程中返回为0,调用失败,返回-1。我们知道fork之后子进程拷贝了父进程的PID,拷贝了父进程的代码内容,那我们都只子进程拷贝之后是从fork之后的下一条语句执行,因为计数器设置为了fork函数之后的下一条指令。这里我们留两个小问题:
        1、程序计数器是怎样实现代码定位的。
        2、代码段是真的拷贝了一份吗?
        今天我们来解决的问题是,fork之后子进程和父进程的数据是否共享。我们可以写一份代码测试一下。
#include
#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();
   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);
 }
}

运行结果:


代码中我们测试了全局数据,存放在栈区的临时变量以及堆栈数据,可以发现在子进程中修改之后,父进程中看不到,可以得出结论父子进程的全局数据、栈区和堆栈是不共享。
Windows环境下如何通过MCP Server实现MySQL安全连接与AI集成? 本文详细介绍了在Windows环境下如何通过MCP Server实现MySQL安全连接与AI集成。MCP Server作为大模型与MySQL之间的安全通道,提供权限控制、SSL加密和协议转换功能,显著提升查询性能。文章包含环境配置、安装指南、安全策略及实战案例,帮助开发者高效实现AI与数据库的安全交互。 阅读详情

相关推荐

从SPI协议到文件系统:手把手教你用HAL库给W25Q16移植FATFS(附扇区管理优化方案)

本文详细介绍了如何在STM32平台上,通过HAL库的SPI接口为W25Q16 Flash芯片移植FATFS文件系统。文章从SPI通信基础讲起,深入解析了FATFS底层驱动(diskio.c)的移植要点,并重点探讨了针对W25Q16的4KB物理扇区特性进行扇区管理优化的两种方案,旨在帮助开发者构建稳定高效的文件存储方案。

happy2的博客 1022

【Linux 进程fork父子进程共享数据分析

之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享。接下来我们就来分析分析父子进程是否存在着数据共享。 我们都知道,在linux下,内存存储的位置是全局变量,栈区,堆区,以及文件。字符常量区我们这里作分析。下面我们依次以实际代码来验证它们是否存在着数据共享。所谓的父子进程数据共享,通俗点说...

weixin_30544657的博客 378

蓝桥杯十四届省赛客观题

蓝桥杯十四届省赛客观题,准备冲刺十五届蓝桥杯单片机的同学,值得一看,毕竟最近几年的真题都是非常具有参考价值,愿君成就;

关于fork函数中的内存复制和共享

#include<unistd.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdarg.h> #include<errno.h> #define LEN 2 void err_exit(char *fmt,...); int main(int argc,char *argv[]) { pid_t pid; int loop; .

modi000的博客 900

9.父子进程间的数据共享问题

进程刚执行fork之后,两个虚拟地址空间的用户区数据完全相同,如下图所示:  如上图所示,父子进程中都用一个变量int num = 100,当两个进程仅对该变量执行读操作时,它们读取的是物理内存中的同一区域。而当父进程执行num--,子进程执行num++时,就会分别复制一份num放在同的物理内存区域中,此时,物理内存就含有3份num。父子进程间的数据共享:读时共享,写时复制。父子进程之间能够使用...

Disappear_XueChao的博客 1253

fork函数的理解-数据、代码

1、fork函数创建了子进程,子进程共享进程的代码段,数据段是写时拷贝,读时共享,参考该文,无论是局部变量、全局变量还是堆中的变量,只要是需要写数据,子进程和父进程的变量就相互独立,虽然,变量的地址是一样的,但这个地址是虚拟地址,真正的物理地址是同的。 例如: int main() { pid_t pid; signal(SIGCHLD,signal_hander);//fork之前的代码,只有父进程有 printf("pid = %d\n",getpid());//打印

modi000的博客 504

linux中fork()函数详解(原创!!实例讲解)

一、fork入门知识 二、fork进阶知识 三、fork高阶知识

jason的专栏 44万+

Linux:fork、vfork进程临界区问题

fork x:在父进程中创建子进程,并从x处开始运行,父子进程并行执行。 join t,y:将t-1,并判断t是否为0,若是,则转到y位置。 fork():创建的子进程拷贝了父进程数据段(父、子进程执行次序定)。 vfork():与父进程共享数据段(先执行子进程,当调用exec或exit后父进程才可被调度运行) 防止两个进程同时进入临界区: int c1 = 0, c2 = 0; //c1和...

weixin_40024414的博客 292

linux 进程数据共享并验证结果

目录回顾一 进程数据共享1 验证 进程数据共享 结果 回顾 1 main 函数也是进程 shell 命令行也是 2 父进程 会从 main函数 执行到 fork 函数 停止 3 父进程调用 fork 函数 会克隆出 子进程 4 main shell 父子进程 会发生抢占资源 继续往下 学 一 进程数据共享 如果定义 一个全局变量 父子进程对变量的操作 会会相互影响。 他们之间 内存共享 ??? 父进程调用 frok 之后 会克隆出子进程 并且会拷贝出单独的空间 个子

weixin_59349642的博客 338

linux 数组动态分配内存,具体来说,fork()如何处理Linux中malloc()的动态分配内存?...

我有一个程序与一个父进程和一个子进程。在fork()之前,父进程称为malloc(),并用一些数据填充数组。在fork()之后,孩子需要该数据。我知道我可以使用一个管道,但以下代码似乎工作:#include #include #include #include int main( int argc, char *argv[] ) {char *array;array = malloc( 20 );...

weixin_34249113的博客 186

【Linux内核分析与驱动编程】fork、vfork在分配和共享的区别

fork fork创造的子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容 vfork vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行 用fork、vfork创建进程,设计实验查看二者在分配和共享两方面的区别 (1)分别编写fork.c和vfork.c进行验证 fork.c #include<sys/types...

iefenghao的博客 479

fork()与vfork()、共享文件表

fork()函数和vfork()函数创建进程的区别、共享文件表

qq_57849012的博客 249

fork调用后,子进程与父进程是否共享变量

回顾fork调用 fork系统调用从已存在的进程中生成一个新的进程,这个新的进程就是子进程,我们可以通过fork系统调用的返回值来区分子进程还是父进程。 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程。 我们的问题是,进程中的变量是否由父进程和子进程共享? 背景 最开始我简单的认为,似乎是看视频里说的。对于只读变量,父

浅浅的i的博客 1万+

进程在创建子进程之后,哪些东西共享,哪些东西共享

fork产生的进程为子进程fork的一个特性是父进程所有的打开文件描述符(file_struct)都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项如图。 在linux系统中的具体实现可用下图表示(说明:进程的fs_struct也会被复制,图中没有画出)。 这种共享的方式使父、子进程对同一个文件使用了同一个文件偏移量。如果父、子进程写到同一个文件描述符,但有没有任何形式的同...

qq_45980600的博客 3873

fork进程之间的数据共享问题

进程拷贝进程的所有资源,变量。 注意:子进程拷贝了父进程数据空间、堆、栈等资源的副本, 父子进程共享这些存储空间,共享的空间只有代码段, 子进程修改一个全局变量,父进程的这个全局变量会改变,因为是一个副本。 所以下面的程序子进程会输出: #include <unistd.h> #include <stdio.h> int main() { pid_t pid; pid = fork(); int countf = 0; int counts

xihahakkk的博客 1538

fork()后父子进程共享文件

fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中各返回一次。 fork的另一个特性是所有由父进程打开的描述符都被复制到子进程中。父、子进程中相同编号的文件描述符在内核中指向同一个file结构体,也就是说,file结构体的引用计数要增加。 下面展示了一个返回本地时间给客户的简单客户-服务器模型,其中服务端为了并发处理来自客户的请求会调用fork创建

null 2213

Linux fork函数详解与共享资源

在 Linux 系统中,‌跨进程同步‌可通过多种机制实现:‌信号量、‌管道、‌共享内存与原子操作、‌信号、‌文件锁、‌消息队列、‌套接字。fork()函数用于从一个已经存在的进程中创建一个新进程,新进程被称为子进程,而原进程称为父进程。包括实际用户ID、实际组ID、有效用户ID、有效组ID、附加组ID、进程组ID、会话ID等‌。包括进程ID(PID)、父进程ID(PPID)、资源使用统计(如tms_utime)等‌。在Linux中,fork()系统调用创建的子进程默认会与父进程共享以下资源。

深之JohnChen的专栏 1164

linux fork 内存拷贝,关于fork函数中的内存复制和共享fork函数内存共享

关于fork函数中的内存复制和共享fork函数内存共享原来刚刚开始做linux下面的多进程编程的时候,对于下面这段代码感到很奇怪,1 #include2 #include3 #include4 #include5 #include6 #include7 #define LEN 28 void err_exit(char *fmt,...);9 int main(int argc,char *ar...

weixin_28289089的博客 611

fork后父子进程共享资源

fork后父子进程共享资源Unix环境高级编程中8.3节中说,“子进程是父进程的副本。例如,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本。父进程和子进程共享这些存储空间部分。父进程和子进程共享正文段。”书中还预留了例子说明子进程对变量所做的改变并影响父进程中该变量的值。/** * fork.c * 探讨父子进程共享变量问题 **/#include <stdio.h

teffi的专栏 1万+

UNIX/LINUX fork函数的问题 并适合共享

一位朋友问我一个关于socket通信的相关问题,其需要解决的问题如下:需要存在一个服务器进程,服务器进程会进行监听,负责建立与客户端的socket连接,同时可以存在多个客户端进程,客户端进程之间可以进行通信,过客户端之间并会建立socket连接,通信是通过将信息发送给服务端进程,服务端进程查找与目标客户端建立的socket标志来进行信息的发送。为了解决上面的问题,这位朋友在服务端进程中自定义了一个链表用于保存与服务器建立的socket连接的客户端名称以及对应的socket。

qq_45523675的博客 1694
上一篇: 查看进程打开的文件和文件被哪些进程打开
下一篇: fork之写时拷贝技术
Betty2017
博客等级 码龄9年 11粉丝 41原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值