Что такое хороший и оптимизированный способ запуска команды оболочки в pthread? - PullRequest
0 голосов
/ 14 февраля 2019

По сути, я хочу сжать файл в потоке pthread с помощью gzip.Первое решение, которое всплывает в памяти и в Google, это вызвать system ().

Что предлагает сообщество stackoverflow?

  1. Должен ли я использовать system () вpthread?

  2. Или мне самому просто разветвиться и выполнить в pthread?Но так как pthread является потоком, целесообразно ли использовать fork () и exec () в потоке pthread?

  3. Или какой подход лучше, чем приведенный выше?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019
  1. Вы не должны использовать system для этого, но не потому, что это дорого.(Для любого файла, который стоит потрудиться сжать, издержки любого метода для запуска фонового сжатия gzip незначительны по сравнению со стоимостью самого сжатия.) Причина, по которой вы не должны использовать system is, system вызывает оболочку, а это означает, что вам нужно беспокоиться о цитировании аргументов.Если вместо этого вы используете fork и execvp, вам не нужно беспокоиться о цитировании.

  2. Проблемы, связанные со смешением fork и wait с потоками,реально, но они податливы.Если ваша ОС имеет posix_spawn, она позаботится о некоторых из этих проблем для вас.Обычно я не рекомендую posix_spawn, потому что код, который его использует, в целом сложнее поддерживать, чем код, который использует fork, но для этого приложения все должно быть в порядке.Я не могу составить исчерпывающее руководство по смешиванию fork и wait с потоками в этом поле ответа.

  3. Альтернатива, которую вы должны рассмотреть, - это сжатие данных в потоке, который будет ожидатьдля процесса gzip, используя zlib .Это позволяет избежать проблем смешивания fork и wait с потоками, но добавляет библиотечную зависимость к вашей программе, что может быть не так удобно, как полагаться на внешний исполняемый файл gzip.

0 голосов
/ 14 февраля 2019

Начните с system вызова в другом потоке и добавляйте сложность только при необходимости.

Дополнительная сложность выполнения fork / exec или использования библиотеки zip стоит только усилий, еслиsystem по какой-то причине недостаточно (т.е. вы хотите перенаправить как stdin, так и stdout дочернего процесса в ваш родительский процесс, либо хотите сжать файл в памяти для отправки его по сети без записи новогофайлы).

...