Правильное использование вилки, ожидания, выхода и т. д.

StackOverflow https://stackoverflow.com/questions/774048

  •  13-09-2019
  •  | 
  •  

Вопрос

Мне нужно решить эту проблему, и я понятия не имею, как это сделать, потому что для ее решения мы можем использовать лишь несколько системных вызовов, и я не понимаю, насколько они полезны в этой ситуации.

Упражнение:
У меня есть матрица размером [10][1000000] с целыми числами, и для каждой строки я создаю новый процесс с помощью fork().Идея каждого процесса состоит в том, чтобы просмотреть все числа для этой конкретной строки и найти определенное число, а затем напечатать сообщение о нем.Это был первый шаг проблемы, и она решена.Второй шаг — напечатать общее количество вхождений этого числа в каждой строке. по порядку.И, наконец, общая сумма появлений этого числа.

Звонки:
Системные вызовы, которые я могу использовать, описаны в документе для этого упражнения следующим образом:

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

Проблема:
Я понятия не имею, как это сделать, потому что exit() вызов позволяет мне передавать только число ниже 256, что, если количество вхождений больше этого числа?Как мне вернуть такой номер?

Другая проблема:
Я не совсем понимаю разницу между wait() и waitpid() и как/где использовать одно над другим.Помимо справочных страниц, есть ли еще какая-нибудь документация, где я могу увидеть примеры кода и тому подобное, чтобы лучше их понять?Или может кто-нибудь объяснить мне различия и предоставить простой пример, демонстрирующий такие различия?

Это было полезно?

Решение

Использовать waitpid() последовательно собирать статусы завершения дочерних процессов;с использованием wait() не дает никаких гарантий относительно последовательности извлечения трупов детей.

В Unix статус выхода ограничен 8 битами, которые могут рассматриваться программой, извлекающей данные, как знаковые или беззнаковые.Вы также получаете 8-битное значение, идентифицирующее номер сигнала и состояние дампа ядра завершенного дочернего процесса.AFAIK, либо биты состояния, либо сигнальные биты всегда равны нулю (а часто и то, и другое - при успешном завершении процесса).

Если вы не знаете, что возвращаемые числа меньше 256, то статус выхода — не лучший вариант.Как уже говорили другие, в этом случае вам придется использовать другой IPC.Если это единственные разрешенные системные вызовы, то вам придется сделать вывод, что значения будут меньше 255 или что переполнение не имеет значения.Ни один из них не является удовлетворительным в качестве вывода за пределами домашнего задания, но в «реальном мире» вы также не ограничены четырьмя системными вызовами.

Смотрите также Коды выхода больше 255?.Обратите внимание, что в Windows диапазон кодов выхода намного шире, но вы не используете системные вызовы, перечисленные в вопросе.


Наблюдение:когда я делаю exit(1), значение в статусе от wait() составляет 256;есть ли для этого причина?

Отвечать:да.Младшие 8 битов слова состояния кодируют номер сигнала и т. д.;старшие 8 бит (16-битного) слова состояния кодируют статус выхода.

Видеть <sys/wait.h> и макросы WIFEXITED(), WEXITSTATUS() и т. д.

Другие советы

Я думаю, что то, что вы делаете, должно работать нормально - просто верните количество вхождений в качестве кода выхода из процесса.

Вы упомянули, что exit() допускает только числа ниже 256.Я очень сомневаюсь, что это так, но вам было бы достаточно просто написать тестовую программу, чтобы убедиться в этом наверняка.

Похоже, это на самом деле просто упрощенная версия Уменьшение карты.Возможно, вам захочется взглянуть на этот алгоритм, чтобы получить некоторые идеи о том, как можно дополнительно распараллелить программу - и, возможно, получить дополнительную оценку :)

Что касается разницы между wait() и waitpid() — если вы просто хотите дождаться завершения любого из ваших дочерних процессов, вам следует использовать wait().Если вы хотите дождаться только определенного дочернего процесса или просто проверить, завершился ли дочерний процесс без зависания, вы должны использовать waitpid().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top