Создает ли if(fork()) дочерний процесс?
Я пересматриваю экзамен по операционной системе и в настоящее время пытаюсь понять этот вопрос процессов:
int main()
{
int v=0;
if(fork())
{
v++;
if(!fork())
{
fork();
v--;
}
}
}
Таким образом, вопрос задает
Нарисуйте дерево, отражающее родительско-дочернюю иерархию процессов, созданных при запуске вышеуказанной программы.
Сколько отдельных копий целочисленной переменной 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
не удалось (например, из-за того, что вашей системе недостаточно памяти или из-за того, что вы превысили некоторые ограничения) и дает -1fork
у ребенка получилось так да 0fork
преуспел в родителе, поэтому отдает пид ребенка.
Но когда вы код 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--;
}
}
}