📜  c 在 fork 之间共享变量 (1)

📅  最后修改于: 2023-12-03 14:59:39.324000             🧑  作者: Mango

Cfork 之间共享变量

C 语言中,使用 fork() 函数可以创建一个子进程,该子进程与父进程共享同一地址空间和资源,但是每个进程都有自己独立的进程 ID(PID)以及文件描述符。

当多个进程同时访问同一个变量时,就会出现变量值的不一致问题。而当父进程和子进程访问同一个变量时,它们之间的变量也是可以共享的。

下面是一个简单的示例:

#include <stdio.h>
#include <unistd.h>

int main(){
    int num = 0;
    pid_t pid = fork();
    if(pid == 0){
        // child process
        num += 5;
        printf("Child process, num = %d\n", num);
    }else if(pid > 0){
        // parent process
        num += 10;
        printf("Parent process, num = %d\n", num);
    }else{
        // fork error
        fprintf(stderr, "Fork error!\n");
        return 1;
    }
    return 0;
}

在上面的代码中,首先定义了一个整型变量 num,然后通过调用 fork() 函数创建一个子进程。在子进程中,将 num 的值增加 5,并输出结果;在父进程中,将 num 的值增加 10,并输出结果。

如果我们运行上面的代码,可能会得到如下的输出:

Parent process, num = 10
Child process, num = 5

可以看到,父进程和子进程共享了同一个 num 变量,但是它们之间的变量值并不相同。这是因为父进程和子进程是两个不同的进程,它们之间的操作是互相独立的。

需要注意的是,虽然父进程和子进程之间可以共享变量,但是它们之间的共享只是在 fork() 函数被调用之后才生效的,也就是说,如果在 fork() 之前对变量进行修改,则不会对另一个进程产生影响。

此外,如果在子进程中修改了变量的值,那么这个变量的值也不会对父进程产生影响。同理,在父进程中修改变量的值也不会对子进程产生影响。因为在 fork() 调用之后,父进程和子进程各自拥有自己的地址空间,它们之间的变量都是独立的。

因此,在编写使用 fork() 函数的程序时,我们需要注意变量的共享和独立性,以免产生意想不到的错误。