在分叉进程上使用相同的变量

Era*_*ray 1 c fork

我期待这段代码

void func(int* count)
{
    *count += 1;

    char* buf[100];
    sprintf(buf, "%d -> %d\n", count, *count);
            write(1, buf, strlen(buf));
}
int main()
{
    int* count = 0;
    int pid = fork();
    if(pid == 0)
    {
        func(&count);
    }
    else
    {
        func(&count);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将打印

1444711088 -> 1
1444711088 -> 2
Run Code Online (Sandbox Code Playgroud)

因为2 fork使用相同的内存单元格(1444711088)作为count变量,当其中一个修改它的值时,其他一个将受到影响.但它没有按预期工作.打印这个:

1444711088 -> 1
1444711088 -> 1
Run Code Online (Sandbox Code Playgroud)

你能说出这段代码的问题在哪里吗?

R S*_*ahu 6

您询问:

你能说出这段代码的问题在哪里吗?

代码存在问题,但不是您认为的问题.您对分叉流程如何工作的理解并不恰当.

每个进程都有自己的进程内存空间副本.地址1444711088父进程是从地址不同1444711088的子进程.它们可以保持独立变化的值.

您的代码受到未定义的行为的影响.

int* count = 0;
Run Code Online (Sandbox Code Playgroud)

将指针初始化0为不是有效地址.你的意思是使用:

int count = 0;
Run Code Online (Sandbox Code Playgroud)

代替?