c - fork() 和 wait()/父/子更改的值

标签 c fork process wait

如果我有以下代码(来自 Silberschatz,操作系统),为什么 P 行中的值变为 0?我以为父进程等到子进程完成,子进程设置 value = 5。

有人能给我解释一下吗?

int value = 0;
void *runner(void *param);

int main(int argc, char *argv[])
{
    int pid;
    pthread_t tid;
    pthread_attr_t attr;
    pid = fork();

    if (pid == 0) {
        pthread_attr_init(&attr);
        pthread_create(&tid,&attr,runner,NULL);
        pthread_join(tid,NULL);
        printf("CHILD: value= %d \n",value); /* LINE C */
    }
    else if (pid > 0) {
        wait(NULL);
        printf("PARENT: value= %d \n",value); /* LINE P */
    }
}

void *runner(void *param) {
    value = 5;
    pthread_exit (0);
}

最佳答案

当您 fork 时,您创建了一个全新的进程,其中包含来自父进程的内存的副本。 (操作系统可能会使用技巧来加快速度,但语义仍然存在。)

父级看不到对子级变量所做的更改 - 它们是具有独立内存的独立进程。

另一方面,线程共享相同的内存区域。因此,运行 runner 的线程中的更改对于子线程的主线程是可见的。

关于c - fork() 和 wait()/父/子更改的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322378/

相关文章:

c - 为什么这个 switch case 总是返回 0?

c - getc 函数产生段错误

c - fork 后退出子进程

java - 如何在另一个java程序中编译和运行java程序?

c++ - C++ 中没有提升的语音识别或 msconfig

python - 从 Arduino Yun 执行 MySQL 脚本(无需 Python)

c - 我该如何解决这个分配问题(核心转储)?

objective-c - OSX 弃用警告 CMake

linux - shell 是否使用管道与 "ls"通信?

c++ - getppid() 不返回 parent 的 pid