我在使用 fork 及其在写入系统上的副本时遇到了一些问题。我将创建 params.writersCount 进程,并且在每个进程中我都需要获取其内部 id(从 1 到 params.writersCount)。所以在孩子中,我正在等待父进程,它初始化孩子的内部 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;
}