Понимание реентерабельной родительской функции, которая ожидает дочернего процесса неблокирующим образом
У меня есть некоторый код C++, работающий в Linux, в котором рекурентный, возвращающий bool, родительский процесс разветвляет дочерний процесс (конечно, только один раз), а затем использует waitpid для проверки состояния выхода указанного дочернего процесса. Если дочерний процесс завершен, он возвращается к родительскому процессу, а затем дочерний завершается, а затем родительский процесс видит это состояние выхода и возвращает значение true (а затем переходит к другому коду).
В противном случае, если дочерний процесс все еще выполняется, родительский процесс также увидит это и вернет false, а затем родительский процесс будет вызываться снова и снова, пока дочерний процесс не завершится и не завершится.
Другими словами, родительский процесс вызывает waitpid с помощью WNOHANG и, таким образом, ожидает дочернего элемента неблокирующим образом.
Термин "ожидание" здесь немного неправильный, так как родительская функция не ожидает завершения дочернего процесса перед возвратом; однако родитель не перестанет быть вызванным, пока ребенок не закончит.
так что-то вроде:
main()
{
while(status != true)
{
status = funcThatCallsFork();
}
// child completed and parent saw exit status and is moving on now
}
bool funcThatCallsFork()
{
//if first pass
fork()
//child code (pid == 0)
{
funcThatChildCalls();
_exit(); // child exits as soon as it returns from call
}
//else not first pass
//check waitpid with WNOHANG for status change of child
//if child exited return true, else return false
}
funcThatChildCalls()
{
// do time consuming stuff
// return
}
Мой вопрос заключается в том, что, поскольку дочерний процесс был порожден в кадре родительского процесса #1, и к тому времени, когда дочерний процесс завершится, родительский процесс теперь будет в некотором кадре # (1+n); тогда как дочерний процесс узнает, что он возвращается к текущему фрейму родительского процесса, а не к фрейму родительского процесса, из которого он был создан (т. е. фрейм № 1)? Действительно, это основано на тестировании, которое я провел; просто пытаюсь понять почему.
Спасибо за ваше время!