簡體   English   中英

是否可以使用Linux的clone()系統調用在同一地址空間中運行多個應用程序?

[英]Is it possible using Linux's clone() system call to run multiple applications in the same address space?

如果您沒有將CLONE_VM標志傳遞給clone(),則新進程將與原始進程共享內存。 可以使用它來使兩個不同的應用程序(兩個main())在同一進程中運行嗎? 理想情況下,這就像用CLONE_VM調用clone()然后再調用exec()一樣簡單,但是我知道它可能涉及更多。 至少,我認為生成的應用程序需要編譯為可重定位(-fPIC)。 我意識到我總是可以將應用程序重新編碼為庫,並創建一個主應用程序,將其他“應用程序”生成為線程,但是我很好奇這種方法是否可行。

好吧,是的,那就是線程,減去“兩個不同的main()/ application”部分。

實際上,存在clone(2)的原因是要實現線程。

Clone(2)或多或少要求您聲明一個單獨的堆棧(如果不創建一個堆棧),因為如果沒有它,則子級將無法從其當前調用級別返回而不會破壞父級的堆棧。

一旦開始為每個進程設置堆棧,則最好使用posix線程庫。

至於加載兩個不同應用程序的部分,則最有可能不是調用execve(2) 如今,內核仍然無法精確地運行程序。 更典型的是,將映像設置為運行Elf動態加載程序,這就是內核真正運行的全部。 然后,加載程序將進程及其庫mmaps(2)放入地址空間。 當然可以做到這一點,以獲得“兩個不同的應用程序”,並且線程調度程序將很樂意通過clone(2)將它們作為兩個進程運行。

為什么不將應用程序編譯為相同的可執行文件,而僅將它們作為main中的線程啟動?

無論如何,將它們作為單獨的任務運行是什么問題? 如果您確實願意,您仍然可以共享內存。

簡短的回答:這是不可能的。

好吧,如果您願意編寫自己的自定義ELF加載程序並模擬內核通常為進程執行的許多操作,則有可能。

最好將每個應用程序編譯到一個庫中,該庫只公開一個主要函數(重命名為其他函數)。 然后,主存根程序應鏈接兩個庫並調用每個庫的導出函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM