我在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;
}
答案 0 :(得分:0)
对我来说并不完全清楚,但看起来你正试图让父母修改孩子中的作家数组。那样不行。在fork之后,父进程所做的任何写操作都不会在子进程中看到,因为写入时的副本同时适用于子进程和父进程。此外,使用nanosleep等待甚至远程可靠。与子进行通信的一种简单方法是在fork之前打开一个管道,并使用它来进行同步和传递数据。只需将父数据写入管道即可。孩子在阅读时阻止而不是纳米睡眠,因此通过阅读提供同步。
答案 1 :(得分:0)
您不能在子级中访问父级分配的值 叉子。有几种选择:
更改您的整体方法,因此不需要 - 依赖于fork之前可用的信息,或者在父母和子女之后独立派生的信息。
使用进程间通信方式 - 套接字,管道,共享内存等