分叉和共享页面

时间:2012-04-28 15:03:36

标签: linux unix fork

我在fork及其写入系统上的副本时遇到了一些麻烦。 我将创建params.writersCount procesess并在每个我需要获取其内部id(从1到params.writersCount)。所以在孩子我正在等待父进程,初始化childs内部id(writers [i] = processId)。然后我可以调用writerSimulation并传递上下文地址就像参数一样,因为在context.id现在是该子项的内部id,因为写入系统上的副本(context.id = j + 1将强制unix复制页面,所以每个孩子然后拥有自己的上下文副本及其内部id)。但是,如果我尝试在writerSimulation函数中使用context.id,我得到0.我做错了什么?

for(int i = 0; i < params.writersCount; i++)
{
    pid_t processId = fork();

    if(!processId)
    {   
        srand((unsigned int)(seconds+getpid()));
        while(!context.id)
        {
            for(int j = 0; j < params.writersCount; j++)
            {   
                if(writers[j] == getpid())
                {   
                    context.id = j+1;
                }
            }
            struct timespec wait = {.tv_sec = 0, .tv_nsec = 500000};
            nanosleep(&wait, NULL);
        }
        int simError = writerSimulation(&context);
        return simError;
    }

    writers[i] = processId;
}

2 个答案:

答案 0 :(得分:0)

对我来说并不完全清楚,但看起来你正试图让父母修改孩子中的作家数组。那样不行。在fork之后,父进程所做的任何写操作都不会在子进程中看到,因为写入时的副本同时适用于子进程和父进程。此外,使用nanosleep等待甚至远程可靠。与子进行通信的一种简单方法是在fork之前打开一个管道,并使用它来进行同步和传递数据。只需将父数据写入管道即可。孩子在阅读时阻止而不是纳米睡眠,因此通过阅读提供同步。

答案 1 :(得分:0)

您不能在子级中访问父级分配的值 叉子。有几种选择:

  • 更改您的整体方法,因此不需要 - 依赖于fork之前可用的信息,或者在父母和子女之后独立派生的信息。

  • 使用进程间通信方式 - 套接字,管道,共享内存等