Opened 3 weeks ago

Closed 2 weeks ago

#814 closed улучшение (fixed)

Заменить fork()+execl() и popen() на posix_spawn()

Reported by: alx Owned by: alx
Priority: средний Milestone: 2 очередь
Component: sw Keywords:
Cc:

Description

В настоящее время для запуска внешних процессов swd выполняет fork(), затем закрывает все файловые дескрипторы (кроме нужных для коммуникации) и затем выполняет execl().

Выполнение fork() - тяжелая операция, так как создается копия "тяжелого" процесса swd. Предлагается выполнять внешние процессы с помощью вызова posix_spawn(), который не дублирует память процесса, а блокирует родительский процесс до момента старта образа процесса-потомка. Экспериментально подтверждено, что в условиях значительного объема памяти, используемой родительским процессом, вызов posix_spawn() ведет себя лучше (работает даже когда fork() завершается с ошибкой). Вместо закрытия дескрипторов предлагается устанавливать им флаг CLOEXEC.

Аналогичным образом следует заменить вызовы popen(), также использующей fork().

Change History (2)

comment:1 by alx, 3 weeks ago

In 2640/sw:

Добавлена вспомогательная функция set_all_cloexec()
которая устанавливает флаг CLOEXEC всем открытым
файловым дескрипторам процесса. See #814.

comment:2 by alx, 2 weeks ago

Resolution: fixed
Status: newclosed

In 2641/sw:

Запуск внешних программ переведен на posix_spawn()

Вызовы fork()/popen() больше не используются.
Closes #814.

Note: See TracTickets for help on using tickets.