Почему при разветвлении я получаю два значения для этой переменной? - PullRequest
0 голосов
/ 12 июля 2020
#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?

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Потому что после первого fork у вас есть два процесса, оба печатающие строку 1: и родительский, и дочерний процессы выполняют этот оператор.

Было бы понятнее, если бы вы также напечатали rc в этой строке:

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

С примерами pid из вопроса выше должно быть напечатано

from 1: 5890 5891
from 5: 5890
from 1: 5891 0
...
1 голос
/ 12 июля 2020

1.

Почему 1 выполняется дважды?

Потому что printf("from 1: %d\n", pid); выполняется обоими процессами, родительским и дочерним.

Вызов fork() before создает два разных процесса (в случае успеха).

2.

Почему я получаю два значения для переменной pid?

Из Linux справочной страницы :

«getpid() возвращает идентификатор процесса (PID) вызывающего процесса.»

Значение для pid отличается для дочернего и родительского потому что это два разных процесса, которые вызывают getpid(), и для каждого процесса есть одна переменная pid. Два вызова printf("from 1: %d\n", pid); не относятся к одной и той же переменной pid.

0 голосов
/ 12 июля 2020

1 выполняется дважды, потому что у вас нет условия перед "printf (" from 1:% d \ n ", pid);". Итак, оба процесса разветвлены от "int r c = fork ();" вызовет выполнение этой строки.

...