fork到底是深拷贝还是浅拷贝
还是 到底 拷贝 fork
2023-06-13 09:16:13 时间
面试常问
进程定义两个变量,fork函数在子进程返回0,在父进程返回子进程号,可以看到子进程和父进程的变量地址都是一样的,看起来是一个浅拷贝,但是我们看到,在子进程中改变值并不会影响父进程的值,地址一样,但是值不同?其实这里面涉及到一个技术叫写时复制技术,我们要知道,我们看到的地址是虚拟地址,并不是真实的物理地址,每个进程相同的虚拟地址可以对应不同的物理地址。但是写时复制指的是当你改变某个变量时,物理地址才会改变。所以我们这样理解,首先子进程和父进程的虚拟地址和指向的物理地址都一样,但是当改变某个值时,物理地址才发生改变。
一般的变量会深拷贝,但是像文件句柄呢,例如管道这些文件是共享的,也就是浅拷贝的,可以共用的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
char str[6] = "hello";
int a = 1;
pid_t pid = fork();
if (pid == 0)
{
str[0] = 'b';
a=2;
printf("sub str=%s\n", str);
printf("sub a=%x\n", a);
printf("sub a=%x\n", &a);
printf("sub point:%x\n", &str);
}
else
{
sleep(1);
printf("main str=%s\n", str);
printf("main a=%x\n", a);
printf("main a=%x\n", &a);
printf("main point:%x\n", &str);
}
return 0;
/*
sub str=bello
sub a=2
sub a=ffffe994
sub b=1
sub b=ffffe998
sub point:ffffe9a2
main str=hello
main a=1
main a=ffffe994
main b=2
main b=ffffe998
main point:ffffe9a2
*/
}
相关文章
- 企业要的到底是数字化还是要转型?
- 英特尔CEO基辛格:科技公司CEO还是要懂技术,只看Excel可不行
- 怎么判断一个数是奇数还是偶数,回复1.0_201是奇数还是偶数
- MYSQL 备份到底怎么办,XTRABACKUP 还是 MEB(2)--mysqlbackup MEB
- React的useState和setState到底是同步还是异步呢?
- Mybatis返回集合类型到底是空集合还是null?源码解读
- Google开源Service Weaver,让你无需纠结到底选择单体还是微服务
- 接手了一座年收入 2000 万美元的代码“屎山”,我到底是该重写还是该跳槽?
- Java中线程同步锁和互斥锁有啥区别看完你还是一脸懵逼详解编程语言
- PHP 禁用了cookie session还是可以用的详解编程语言
- SaaS公司到底是软件公司,还是互联网公司?
- 比较Windows和Linux:哪一个更好?(windows好还是linux好)
- Linux下如何创建线程?进程上还是线程上手?(linux进程创建线程)
- 喜欢Oracle,还是SQL Server(like _oracle)
- 乐观锁优于悲观锁 Redis说明(Redis锁悲观还是乐观)
- AI 摄像机彻底懵逼,这到底是「头」还是「球」
- 人工智能将带给人类的,究竟是共同富裕还是两极分化的加剧?