Как узнать вывод в коде с помощью fork ()? - PullRequest
0 голосов
/ 11 апреля 2019
#include <unistd.h>
#include <sys/wait.h>
int main ()
{
    W(A);
    int child=fork();
    W(B);
    if (child)
      wait(NULL);
    W(C);
}

Я думаю, что ABBCC будет одним из выходов, но также и одним из следующих: ACCBB, ABB, ABCBC, ABCAA должны быть правильными. W означает запись, а W (A), W (B), W (C) означает запись A, B, C. Пожалуйста, помогите.

1 Ответ

1 голос
/ 11 апреля 2019

ACCBB невозможно.

Я добавлю индекс p для писем, напечатанных родителем, c для ребенка.

Родительский процесс печатает A p B p C p в указанном порядке, а дочерний процесс печатает B c C с в таком порядке.

A p будет напечатан первым, потому что он напечатан до того, как что-либо разветвлено. Родитель ждет выхода ребенка, прежде чем печатать C p , так что это должно быть последним. Таким образом, это означает, что первый и последний символы A и C.

Между этим нет никаких ограничений на порядок выполнения между двумя процессами. Так что возможно следующее:

* 1 031 * B * * р тысячу тридцать-две B C * * С одна тысяча тридцать пять * 1 036 * C * 1 037 ** 1 038 * В * +1039 * C B * * р тысяча сорок-одна C C * ** 1 045 тысяча сорок четыре * В * * в тысячу сорок шесть С * +1048 * C B р

Первые два выглядят одинаково на выходе, так как мы не можем определить разницу между B p и B c

Итак, возможные результаты:

ABBCC
ABCBC

Все это предполагает, что нет буферизации, которая могла бы задержать вывод. То есть это всего лишь упражнение для изучения порядка выполнения операторов в параллельных процессах, а не ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...