Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fork创建的新进程,但打印变量的相同地址_C_Operating System_Fork - Fatal编程技术网

C 使用fork创建的新进程,但打印变量的相同地址

C 使用fork创建的新进程,但打印变量的相同地址,c,operating-system,fork,C,Operating System,Fork,我的代码如下: #include<stdio.h> #include<unistd.h> int main() { int a=0; printf("before: %d %p\n",a,&a); int t=fork(); if(t==0) { a=a+5; printf("child: %d %p\n",a,&a); } else { a=a

我的代码如下:

#include<stdio.h>
#include<unistd.h>
int main()
{
    int a=0;
    printf("before: %d %p\n",a,&a);
    int t=fork();
    if(t==0)
    {
        a=a+5;
        printf("child: %d %p\n",a,&a);
    }
    else
    {
        a=a+10;
        printf("parent: %d %p\n",a,&a);
    }
    //printf("both: %d %p\n",a,&a);
    return 0;
}
#包括
#包括
int main()
{
int a=0;
printf(“之前:%d%p\n”,a,&a);
int t=fork();
如果(t==0)
{
a=a+5;
printf(“子项:%d%p\n”、a和a);
}
其他的
{
a=a+10;
printf(“父项:%d%p\n”,a和a);
}
//printf(“两者都是:%d%p\n”、a和a);
返回0;
}

为什么所有的地址都打印出来了?我认为在调用fork时会创建变量的新副本。它是否与虚拟地址和物理地址有关?如果是这样,同一虚拟地址如何映射到不同的物理地址?

这些地址是相同的,因为每个(父级和子级)都有自己的地址。Linux计算机已经(由内核和处理器提供)

正在“神奇地”将父进程的虚拟地址空间复制到子进程的虚拟地址空间中(除了
fork
的结果)。这种复制使用惰性技术,因此非常有效。内核正在管理(用于虚拟内存和实现每个虚拟地址空间)

仔细阅读(它有几章与此相关)


顺便说一句,养成调用
fflush(NULL)的习惯
分叉之前
。请参阅。

地址相同,因为每个(父级和子级)都有自己的地址。Linux计算机已经(由内核和处理器提供)

正在“神奇地”将父进程的虚拟地址空间复制到子进程的虚拟地址空间中(除了
fork
的结果)。这种复制使用惰性技术,因此非常有效。内核正在管理(用于虚拟内存和实现每个虚拟地址空间)

仔细阅读(它有几章与此相关)


顺便说一句,养成调用
fflush(NULL)的习惯
分叉之前
。请参阅。

,因为Unix系统使用虚拟地址,并且
fork
创建父进程的精确副本。这个精确副本当然包括(初始)内存映射。

因为Unix系统使用虚拟地址,而
fork
创建父进程的精确副本。这个精确的副本当然包括(初始)内存映射。

因为这就是
fork
所做的。Per:

fork()
函数将创建一个新流程新流程 (子进程)应是调用进程的精确副本 工艺)除以下详细说明外:

  • 子进程应具有唯一的进程ID

  • 子进程ID也不得与任何活动进程组ID匹配

  • 子进程应具有不同的父进程ID,该ID应为调用进程的进程ID

  • 子进程应有其自己的父进程文件描述符副本。每个孩子的文件描述符都应参考
    相同的打开文件描述,对应的文件描述符为
    父母

  • 子进程应有其自己的父进程开放目录流副本。子进程中的每个打开的目录流
    可以与相应的
    父目录的目录流

  • 子进程应有其自己的父进程消息目录描述符副本

  • tms_utime、tms_stime、tms_cutime和tms_cstime的子进程值应设置为0

  • 应将闹钟信号重置为零的剩余时间,如果有,应取消闹钟;见警报

  • [XSI][Option Start]应清除所有semadj值。[选项结束]

  • 父进程设置的文件锁不应由子进程继承

  • 子进程的待处理信号集应初始化为空集

  • [XSI][Option Start]间隔计时器应在子进程中重置。[选项结束]

  • 在父进程中打开的任何信号量也应在子进程中打开

  • [ML][Option Start]子进程不应继承父进程通过调用
    mlockall()或mlock()。[选项结束]

  • 在父进程中创建的内存映射应保留在子进程中。映射\从父级继承的私有映射应 也可以在子对象中映射私有映射,以及对 这些映射中的数据是父级在调用 儿童应能看到叉子()。对数据的任何修改 在MAP_中,在fork()返回后,父级进行私有映射 应仅对母公司可见。对中数据的修改 子项生成的映射\私有映射应仅对子项可见 孩子


因为这就是
fork
所做的。Per:

fork()
函数将创建一个新流程新流程 (子进程)应是调用进程的精确副本 工艺)除以下详细说明外:

  • 子进程应具有唯一的进程ID

  • 子进程ID也不得与任何活动进程组ID匹配

  • 子进程应具有不同的父进程ID,该ID应为调用进程的进程ID

  • 子进程应有其自己的父进程文件描述符副本。每个孩子的文件描述符都应参考
    相同的打开文件描述,对应的文件描述符为
    父母

  • 子进程应有其自己的父进程的o的副本