首页 > 试题广场 >

在上下文和头文件均正常的情况下,下面代码的输出结果是

[单选题]
在上下文和头文件均正常的情况下,下面代码的输出结果是()
int main(){
   int pid;
   int num = 1;
   pid = fork();
   if(pid > 0){
   num++;
   printf("in parent:num:%d addr:%x\n", num, &num);
   }
   else if(pid == 0){
   printf("in child:num:%d addr:%x\n", num, &num);
   }
}
  • 父子进程中输出的num相同,num地址不相同
  • 父子进程中输出的num不同,num地址相同
  • 父子进程中输出的num相同,num地址也相同
  • 父子进程中输出的num不同,num地址不相同
推荐
虚拟地址空间。num地址的值相同,但是其真实的物理地址却不一样。
linux下实现了一下,发现地址值真的一样。
fork之后子进程复制了父进程的数据、堆栈。
但是由于地址重定位器之类的魔法存在,
所以,看似一样的地址空间(虚拟地址空间),
其实却是不同的物理地址空间。
同时可以验证c程序中输出的地址空间其实都是虚拟地址空间。

编辑于 2016-03-22 15:58:19 回复(12)
其实刚刚fork出来不止虚拟地址一样,物理地址也一样。当进程发生分歧时,即修改此变量时,才会分配不同的物理地址,也就是copy-on-write,写时复制。
发表于 2016-08-20 10:42:13 回复(2)
问题就出在地址想不相同,如果按照两个进程各处在独自的虚拟进程地址空间分析的话,这个题很容易会选择第四个答案,但是Linux中的资源分配都是虚拟机制,也就是说,他们还是会共用一个虚拟的地址,但是映射到物理内存就可能会不一样。
发表于 2016-02-29 11:21:31 回复(0)
fork()之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因。 
      勘误:子进程的pid是0,子进程的getpid()是它自己的进程号;父进程中的pid值为子进程进程号,只有父进程执行的getpid()才是他自己的进程号。
发表于 2016-01-05 20:55:07 回复(0)
子进程拷贝父进程的堆栈和数据段 创建新的空间 所以num值不同 虚拟地址一样 但是物理地址不同
发表于 2016-03-15 17:20:10 回复(0)
读时共享:读的是相同的虚拟地址
写时复制:复制之后,其实相同的虚拟地址,映射到了不同的物理地址
发表于 2020-06-12 18:15:18 回复(0)
图文并茂的讲解:http://notes.maxwi.com/2016/08/17/linux-fork/
发表于 2016-08-17 20:05:46 回复(0)
写时复制读时共享
发表于 2020-03-10 17:54:12 回复(0)
这个题不清楚原理 瞎蒙了一个
发表于 2018-03-26 22:04:32 回复(0)
虚拟地址空间。num地址的值相同,但是其真实的物理地址却不一样。 linux下实现了一下,发现地址值真的一样。 fork之后子进程复制了父进程的数据、堆栈。 但是由于地址重定位器之类的魔法存在, 所以,看似一样的地址空间(虚拟地址空间), 其实却是不同的物理地址空间。 同时可以验证c程序中输出的地址空间其实都是虚拟地址空间。
发表于 2016-03-10 08:31:46 回复(0)
在fork后,子进程“继承”父进程的变量,其地址总是一样的,因为在fork时整个虚拟地址空间被复制,但是虚拟地址空间所对应的物理内存却没有复制(这个时候父子进程中变量 x对应的虚拟地址和物理地址都相同)。等到虚拟地址空间被写时,对应的物理内存空间被复制(这个时候父子进程中变量 i 对应的虚拟地址还是相同的,但是物理地址不同),这就是"写时复制"。 引用自: http://m.blog.csdn.net/wangfeng2500/article/details/40897855
发表于 2017-11-29 10:28:45 回复(0)
D.行为父进程调用fork()之后生成子进程同时返回子进程pid>0,同时生成的子进程是父进程的复制品,当运行到fork()的时候返回pid=0,虽然是复制品但不等同于物理内存都是一样的,很明显父子进程只是独立在内存当中的两个进程而已,故num变量地址不一样
发表于 2015-12-03 18:09:15 回复(2)
读时共享,写时复制,映射到不同的物理地址
发表于 2022-09-08 20:28:39 回复(0)
答案是B
发表于 2020-08-31 11:33:48 回复(0)
首先值不同大家都知道,但是地址相同可能有人比较迷糊,比如我.其实在这个地址相同相当于两台电脑中的相同地址,虽然地址是相同的,但是他们是互相独立的,并不是同一内存区域的地址.
发表于 2019-06-04 18:00:59 回复(0)
fork()之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的
发表于 2017-08-29 09:57:03 回复(0)
不会复制操作
发表于 2023-03-28 00:29:45 回复(0)
fork会复制父进程的数据和堆栈
发表于 2020-12-25 13:11:16 回复(0)
https://blog.csdn.net/qq_43412060/article/details/104975151关于进程和虚拟地址见上链接 关于为何虚拟地址相同而逻辑地址不同见下链接 https://blog.csdn.net/wangfeng2500/article/details/40897855
发表于 2020-09-13 00:05:16 回复(0)
1

发表于 2020-08-16 17:39:21 回复(0)
fork()运行以后产生两个程序,父进程返回值大于零,可认为是指向子进程,子进程返回0,父进程子进程各执行一遍fork()以下部分代码
发表于 2020-07-04 01:30:39 回复(0)