首页 > 试题广场 >

下面代码中父进程打印出的值设为u和v,子进程打印出的值为x和

[单选题]
下面代码中父进程打印出的值设为u和v,子进程打印出的值为x和y

if (fork() == 0) {
    a = a + 5; 
    printf(“%d, %d\n”, a, &a); 

}

else { 

    a = a – 5;
    printf(“%d, %d\n”, a, &a); 

}

  • u = x + 10 且 v = y
  • u = x + 10 且 v != y
  • u + 10 = x 且 v = y
  • u + 10 = x 且 v != y
Linux下的fork()函数在unistd.h头文件中,是POSIX标准中要求的类UNIX系统都需要提供的一个头文件(在《UNIX环境高级编程》的前两章中有提到这些历史)。

调用fork函数会创建一个子进程,并对当前进程返回新的子进程的进程ID(非负整数),对于子进程本身则返回0,出错返回负数。

当执行到fork()函数时,系统会生成一个子进程,并将拷贝当前进程的变量、内存、堆栈等资源,除了共享代码段。因此,由于父进程的fork返回值大于0,执行else部分语句,子进程执行if部分语句,对a的操作互不影响,因此差值拉大为10。

对a的修改以及输出的a的地址,是进程中的基址所对应的偏移地址,并非真正的物理地址。由于父子进程拷贝了一模一样的资源状况,因此虚拟地址也是相同的。
编辑于 2020-03-21 09:48:45 回复(5)

fork()后,父子进程变量地址一致:

子进程“继承”父进程的变量,其地址总是一样的,因为在fork时整个虚拟地址空间被复制,但是虚拟地址空间所对应的物理内存却没有复制(这个时候父子进 程中变量 x对应的虚拟地址和物理地址都相同)。等到虚拟地址空间被写时,对应的物理内存空间被复制(这个时候父子进程中变量 i 对应的虚拟地址还是相同的,但是物理地址不同),也就是"写时复制"。

发表于 2020-08-28 22:50:50 回复(0)
在子进程中对a进行的操作不会对父进程中的a产生影响,反之同理,这是两个不同的数,即v!=y. x=a+5,u=a-5,所以x-u=10,即u+10=x
发表于 2020-03-21 10:11:36 回复(1)