首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的叉和指针

C语言中的叉和指针
EN

Stack Overflow用户
提问于 2015-11-15 04:25:21
回答 1查看 755关注 0票数 1

有人能帮助我理解系统如何处理在进程进行fork()调用之前设置的变量。下面是我写的一个小测试程序,试着理解幕后发生的事情。

我知道进程的当前状态是“克隆”的,包括在分叉时包含的变量。我的想法是,如果在调用叉之前malloc有一个2D数组,那么我需要释放父进程和子进程中的数组。

从示例代码下面的结果可以看出,这两个值的作用就好像它们彼此完全分开,但它们具有完全相同的地址空间。我期望tmp的最终结果是-4,不管哪个进程先完成。

我对C和Linux比较新,有人能解释一下这是怎么可能的吗?也许变量tmp成为指向每个进程中不同的指针的指针?非常感谢。

代码语言:javascript
复制
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int tmp = 1;
    pid_t forkReturn= fork();

    if(!forkReturn) {

        /*child*/
        tmp=tmp+5;
        printf("Value for child %d\n",tmp);
        printf("Address for child %p\n",&tmp);
    }

    else if(forkReturn > 0){

        /*parent*/
        tmp=tmp-10;
        printf("Value for parent %d\n",tmp);
        printf("Address for parent %p\n",&tmp);
    }

    else {

        /*Error calling fork*/
        printf("Error calling fork);
    }

    return 0;
}

标准输出结果:

代码语言:javascript
复制
Value for child 6
Address for child 0xbfb478d8
Value for parent -9
Address for parent 0xbfb478d8
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-15 04:38:03

它确实复制了整个地址空间,并且在子进程中更改内存不会影响父进程。理解这一点的关键是要记住,指针只能指向您自己的进程中的某个东西,并且副本发生在较低的级别。

但是,您不应该在叉子中调用malloc()或free()。这会导致死锁(调用fork()时,另一个线程在malloc()中)。唯一安全调用子函数的函数也被列为信号处理程序的安全函数。以前,只有当您编写多线程代码时,我才能声称这是真的;然而,Apple很好地在标准库中生成了一个后台线程,所以死锁一直都是真实的。不应允许叉子从if块中脱落。打电话给_exit,确保没有。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33716396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档