Создает ли if(fork()) дочерний процесс?

Я пересматриваю экзамен по операционной системе и в настоящее время пытаюсь понять этот вопрос процессов:

int main() 
{
    int v=0;

    if(fork()) 
    {
        v++;

        if(!fork())
        {
            fork();
            v--; 
        }
    } 
}

Таким образом, вопрос задает

  1. Нарисуйте дерево, отражающее родительско-дочернюю иерархию процессов, созданных при запуске вышеуказанной программы.

  2. Сколько отдельных копий целочисленной переменной v создано? Обсудите, каково значение v в конце программы для каждого из процессов в дереве.

Главное, с чем у меня проблема, это

if(fork())

строка в коде. Глядя на другие переполнения стека, я понял, что

if(fork()) = if(fork() != 0)

но мне все еще трудно понять, создает ли первое утверждение if дочерний процесс? Потому что это единственный способ второго оператора if:

(!fork())

может быть выполнен?

Вот как далеко я продвинулся в своем нынешнем понимании вопроса. скриншот попытки введите описание изображения здесь

Надеюсь, эта диаграмма разборчива! Я был бы очень благодарен за любые подсказки или указатели с этим.

2 ответа

Заметить, что if (fork()) /*etc*/ точно так же, как

pid_t newtmp = fork();
if (newtmp != 0) /*etc*/

где newtmp это новое (новое) имя переменной, не встречающееся в вашей программе (вы можете использовать x1, x2 и т. д.... при условии, что это не встречается в вашей программе), и pid_t это какой-то целочисленный тип (возможно int).

После того, как вы переписали свой код с явными и уникальными именами, полученными в результате fork ты поймешь это лучше.

Кстати, код плохой вкус. Когда вы используете fork вам нужно разобраться с тремя случаями:

  • fork не удалось (например, из-за того, что вашей системе недостаточно памяти или из-за того, что вы превысили некоторые ограничения) и дает -1

  • fork у ребенка получилось так да 0

  • fork преуспел в родителе, поэтому отдает пид ребенка.

Но когда вы код if (fork()) Вы забываете - или неправильно обрабатываете - первый случай (сбой). Это может случиться редко.

Внимательно прочитайте (и несколько раз) справочную страницу fork(2). Обратите внимание, что вилка сложна для понимания.

Что касается ограничений, имейте в виду setrlimit (2)ulimit Баш встроен).

Ответ

if (fork ())

может или может определить, был ли создан дочерний процесс.

Перейти на справочную страницу:

http://man7.org/linux/man-pages/man2/fork.2.html

Мы находим, что fork () возвращает три типа значений:

  • -1 => fork () не удалось
  • 0 => возвращаемое значение в дочернем процессе
  • положительное значение => успех и PID дочернего процесса.

Таким образом, тест

if (fork ()) 

который так же, как

if (fork ()!= 0)

может быть успешным независимо от того, был ли создан дочерний процесс. Грамотно написанный вопрос сказал бы

if (fork () > 0)

Предполагая, что все работает правильно:

int main() 
{
    int v=0;

    if(fork())  // Creates a child process that does nothing.
    {
        v++;

       if(!fork()) // Creates a child process that creates a child process (that then does nothing but decrement v).
       {
           fork();
          v--; 
       }
   }  
}
Другие вопросы по тегам