Определение возможного выхода из системных вызовов read () и fork () - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть проблема в моем тестовом обзоре, которая просит меня найти пять возможных выходных данных этого фрагмента кода.

mydata.txt содержит «1234567890».

Я продолжаю пытаться обернуть голову вокруг происходящих последовательностей, но не могу придумать конкретный ответ в своей голове.

Кроме того, я должен объяснить, является ли 1423 возможным выходом, и объяснить, почему.

На данный момент я понял, что, поскольку fork () происходит после открытия, родительи дочерний процесс используют один и тот же файловый дескриптор.

Но я не могу выяснить все возможные результаты и объяснить, почему 1423 невозможен.Я надеюсь, что кто-то здесь может мне помочь.

int fd;
char buf[5] = "wxyz";
fd = open("mydata.txt", O_RDONLY);
fork();
read(fd, buf, 1);
read(fd, buf+1, 1);
printf("%c%c", buf[0], buf[1]);

1 Ответ

0 голосов
/ 16 декабря 2018

После 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.

...