Возможно ли использовать системный вызов Linux clone () для запуска нескольких приложений в одном адресном пространстве? - PullRequest
0 голосов
/ 30 октября 2009

Если вы не передадите флаг CLONE_VM функции clone (), то новый процесс поделится памятью с оригиналом. Можно ли это использовать, чтобы два разных приложения (два main ()) выполнялись в одном и том же процессе? В идеале это было бы так же просто, как вызвать clone () с CLONE_VM и затем вызвать exec (), но я понимаю, что это, вероятно, более сложный процесс. По крайней мере, я предполагаю, что порожденное приложение должно быть скомпилировано, чтобы быть перемещаемым (-fPIC). Я понимаю, что всегда могу перекодировать приложения в библиотеки и создать мастер-приложение, порождающее другие «приложения» в виде потоков, но мне интересно, возможен ли такой подход.

Ответы [ 3 ]

2 голосов
/ 30 октября 2009

Ну да, это и есть потоки, за исключением части "два разных main () / application".

На самом деле причина clone(2) заключается в том, чтобы реализовывать потоки.

Clone (2) более или менее требует, чтобы вы объявили отдельный стек (если вы его не создадите), потому что без него ребенок не сможет вернуться с текущего уровня вызова, не уничтожив стек родителей.

Как только вы начнете настраивать стеки для каждого процесса, вы также можете просто использовать библиотеку потоков posix.

Что касается части, в которую загружаются два разных приложения, то вызов execve(2), скорее всего, не будет способом сделать это. В наши дни ядро ​​точно не запускает программы. Более типично, что образ настроен для запуска динамического загрузчика Elf, и это все, что на самом деле работает ядро. Затем загрузчик mmaps(2) помещает процесс и его библиотеки в адресное пространство. Конечно, это можно сделать, чтобы получить «два разных приложения», и планировщик потока будет рад запустить их как два процесса через clone (2).

0 голосов
/ 06 ноября 2009

Краткий ответ: это невозможно.

Что ж, возможно, если вы захотите написать свой собственный загрузчик ELF и смоделировать много вещей, которые ядро ​​обычно делает для процесса.

Лучше скомпилировать каждое из приложений в библиотеку, которая предоставляет ровно одну функцию main (переименованную во что-то другое). Затем основная программа-заглушка должна связаться с двумя библиотеками и вызвать экспортированную функцию каждой из них.

0 голосов
/ 30 октября 2009

Почему бы не скомпилировать приложения в один и тот же исполняемый файл и просто запустить их как потоки в main?

В чем проблема, если они выполняются как отдельные задачи? Вы все еще можете поделиться памятью, если действительно хотите.

...