После fork()
у вас есть два процесса, которые я называю A
и B
, которые выполняют эти операции:
1) read(fd, buf, 1);
2) read(fd, buf+1, 1);
3) printf("%c%c", buf[0], buf[1]);
Вы можете написать все возможные комбинации.Пример комбинации:
A
выполняет оператор 1
, таким образом читает 1
из файла и увеличивает позицию курсора в файле A
выполняет оператор 2
, таким образом, читает 2
из файла и увеличивает позицию курсора в файле A
возбуждает оператор 3
, т.е.печатает 12
B
читает 3
из файла B
читает 4
из файла B
печатает 34
.
И так далее.Эти операторы могут выполняться в любом порядке, поэтому сначала обработайте B
первым чтением, затем обработайте A
первым чтением, затем обработайте B
и т. Д.
Мы можем наблюдать, что процессы будутвсегда читайте увеличивающиеся числа из файла.Возможны следующие варианты:
- a) Первый процесс будет читать
12
, а второй - 34
. - b) Первый процесс будет читать
1
, затем второй будет 2
, затем первый будет 3
, а второй будет 4
- c) Первый процесс может читать
1
, затем второй будет читать 23
, затем первый будет читать 4
«Первый процесс» и «второй процесс» не является процессомA
или B
, это не имеет значения, это первый процесс, который получает процессорное время.printf
s из обоих процессов также могут выполняться в любом порядке.Итак, теперь мы можем получить все возможные выходы:
- a) 1)
1234
- a) 2)
3412
- b) 1)
1324
- б) 2)
2413
- в) 1)
1423
- в) 2)
2314
Я предполагаю, что выходные данные процессов полностью буферизированы, поэтому процесс либо записывает полный вывод printf("%c%c", buf[0], buf[1]);
, либо нет.Если выходные данные не буферизированы, то, например, один процесс может вывести printf("%c", buf[0])
, затем второй может вывести его buf[0]
, тогда первый напечатает его buf [1], затем второй buf [1].Затем вы получите гораздо больше комбинаций, поскольку в основном оператор printf("%c%c", buf[0], buf[1])
заменяется двумя операторами printf("%c", buf[0])
и printf("%c", buf[1])
, которые выполняются один за другим в каждом процессе, но оба процесса могут запускать их в любом порядке.
Вывод 1423
возможен, если один из процессов читает 1
из файла, а другой читает 23
из файла, тогда один из процессов читает 4
и printes 14
, изатем другой печатает 23
.