2011-05-12 18 views
2

好吧,很明顯,假設我們有兩個進程AFF想要在具有CPU控制時分叉A(並且A由於CPU處於F而被暫停)。可能會從中分離出一個進程嗎?

我已經谷歌搜索,但沒有任何相關顯示。在Unix環境中可以這樣做嗎?

+0

你能更好地解釋你的目標嗎?你爲什麼要在圖片中放置一個過程F,而看起來你想要的只是從外部克隆過程A.假設現在只有一個進程可以使CPU控制一直過時。 – jlliagre 2011-05-12 12:49:34

+0

我只是好奇。我們不能從該程序代碼之外分叉進程嗎?沒有進一步的目標。 – 2011-05-12 13:22:15

+0

好奇你接受一個答案告訴它是不可能的,而我和後來與技術細節Askurtun都回答這是可能的... – jlliagre 2011-05-13 09:09:48

回答

1

我不認爲這是無論如何都沒有好主意,但它可能是可能的過程F使用調試器接口連接到Aptrace。做類似於暫停目標進程,保存其狀態,轉移進程以運行fork,然後恢復其原始狀態。

應該指出,你的克隆過程可能需要處理線程等一些奇怪的情況。

1

不,這是不可能的。

fork()系統調用,使母公司的一個副本,因此,如果您在F過程調用fork(),孩子將是F副本,沒有什麼可以做,以改變這種行爲。

+0

也許某些'root'級進程可以讀取'A'的內存映射,然後用'process_t'創建完全相同的代碼/堆棧/內存區域。人們不能執行這樣的事情嗎?是否有限制? – 2011-05-12 12:19:51

+0

@據我所知,這是不可能出於安全原因,但我不是專家。 – krtek 2011-05-12 12:23:47

2

從外部克隆進程肯定沒有標準和/或可移植的方式,但取決於操作系統,當然有可能的方式將流程從其任務中轉移出來,迫使它克隆自己或做任何你想做的事。

1

不,這將是一個巨大的安全漏洞,如果可能會導致敏感信息泄露。最好的情況是,你可以在父進程中設置一個信號處理程序,將fork(2)關閉子進程(可能是exec(2)預先配置的子進程?)。

我認爲通過查看具有CPU親和力設置的兩個進程之間的消息傳遞可以更好地服務,但即使如此,我認爲增益會是名義上的(過度優化問題?)。

http://www.freebsd.org/cgi/man.cgi?query=cpuset&apropos=0&sektion=0

+0

這是可能的,這不是一個安全漏洞,只要該進程屬於您或您擁有管理權限。調試器會一直這樣做,而且會變得更糟。 Solaris或FreeBSD上的Dtrace也是一個不錯的選擇。 – jlliagre 2011-05-12 20:29:02

+0

s/provide/provided/ – jlliagre 2011-05-13 09:06:42

+0

正確。如果UID匹配,則可以對任何其他進程執行幾乎任何操作。如果UID不匹配,你就不會(也不應該)被允許做任何事情(除非你是根,在哪一點......有樂趣)。 – Sean 2011-05-20 20:21:51

1

這是不可能的原因是因爲,通常與fork(),兩個進程之間開始有一個區別:fork()調用本身的返回值。如果在A的代碼中沒有這樣的調用,那麼進程之間沒有任何區別,所以他們都會做同樣的事情,通常情況下,您希望某個進程開始做一些不同的事情。

你到底想要做什麼應該如何工作?

相關問題