Понимание реентерабельной родительской функции, которая ожидает дочернего процесса неблокирующим образом

У меня есть некоторый код 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)? Действительно, это основано на тестировании, которое я провел; просто пытаюсь понять почему.

Спасибо за ваше время!

0 ответов

Другие вопросы по тегам