C/C++ Linux Запуск програмы из контекста другой програмы без копрования стека, списка файлов и прочего
Предположим что существуют два независимых приложения A и B. Каждое из приложений имеет свою сферу применения и задачи. Они могут запускаться пользователем как самостоятельные приложения. В процессе работы каждое из приложений может иметь открытыми тысячи файлов и хранить в ОЗУ гигабайты данных. В качестве фичи каждое из приложений может запускать второе приложение отдельным процессом. При этом сценарий запуска A->B->A->B->A->B->... не запрещен.
fork() и exec() как мне кажется в данном примере не подходят, тк будут крайне медленны и ресурсозатратны; к тому же дочернему процессу совершенно не нужен доступ к данным от родителя.
Есть ли какой то системный вызов способный создать новый процесс как "чистый" запуск?
Ответы (1 шт):
У дочернего процесса не будет доступа к данным (памяти) родителя, так как после execve создается новое адресное пространство. Стек у каждого нового потока выполнения будет свой в любом случае. А вот проблема утечки ресурсов из-за копирования таблицы файловых дескрипторов весьма актуальна. Многие программы и библиотеки откровенно забивают на использование флага FD_CLOEXEC для файлов. Соответственно запуск таких программ по образу A->B->A->B->A->B->... неминуемо ведет к исчерпанию дескрипторов либо непреднамеренному удержанию файлов в открытом состоянии. Чтобы этого избежать необходимо озадачиваться легковесным процессом-супервайзером (привет, Erlang), который бы занимался именно запуском A и B, гарантированно не передавая в новые процессы нежелательных файловых дескрипторов.