【问题标题】:Why do I get two values for this variable when forking?为什么我在分叉时会得到这个变量的两个值?
【发布时间】:2020-07-12 09:30:07
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int rc = fork();
    int pid = getpid();
    
    printf("from 1: %d\n", pid);
    if (rc == 0) {
        printf("from 2: %d\n", pid);
        rc = fork();

        if (rc == 0) {
            printf("from 3: %d\n", pid);
        } else {
            printf("from 4: %d\n", pid);
        }
            
    } else {
        printf("from 5: %d\n", pid);
    }
}

当我运行这段代码时,我得到了这个输出:

from 1: 5890
from 5: 5890
from 1: 5891                                                                                             
from 2: 5891
from 4: 5891
from 3: 5891

1 - 为什么1 会被执行两次?

2 - 为什么我得到变量pid 的两个值?

【问题讨论】:

  • 1 - 因为你打电话给fork。 2 - 因为你打电话给fork

标签: c process fork


【解决方案1】:

因为在第一个fork 之后,您有两个 进程都打印1 行:父进程和子进程都执行该语句。


如果您也在该行上打印rc 可能会更清楚:

printf("from 1: %d %d\n", pid, rc);

使用问题中的示例 pid,上面应该打印出来

从 1: 5890 5891 从 5: 5890 从 1: 5891 0 ...

【讨论】:

    【解决方案2】:

    1.

    为什么 1 会被执行两次?

    因为printf("from 1: %d\n", pid); 由父进程和子进程这两个进程执行。

    之前对fork() 的调用会创建两个不同的进程(成功时)。


    2.

    为什么我会得到变量pid 的两个值?

    来自Linux man page

    "getpid()返回调用进程的进程ID(PID)。"

    pid 的值在子进程和父进程之间是不同的,因为它是两个不同的进程调用getpid(),并且每个进程都有一个pid 变量。对printf("from 1: %d\n", pid); 的两次调用不引用同一个变量pid

    【讨论】:

      【解决方案3】:

      1 被执行两次,因为在 "printf("from 1: %d\n", pid);" 之前没有条件。因此,两个分叉进程都来自“int rc = fork();”将导致该行执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多