2012-04-06 88 views
1

是否可以用克隆模擬vfrok的行爲?到目前爲止,我有Simulatin vfork與克隆

pid=clone(fn,cStack,SIGCHLD|CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_VFORK,NULL); 

但我仍然需要通過我自己的堆棧,因此新工藝在不同的堆棧幀,但在相同的地址空間(因爲CLONE_VM的)工作,並按照我的理解,如果我調用vfork並且不使用exec中的某個函數,新進程在與父進程相同的地址空間中運行,並且它使用相同的堆棧幀。

那麼是否有可能使用克隆的新進程在同一地址空間中運行,並且使用與父進程相同的堆棧幀?

回答

2

如果不在彙編程序中編寫函數,這是不可能的。這是一個不能「固定」的基本問題;即使是系統調用包裝器本身也必須用匯編語言編寫,而不是用C語言編寫大多數文件系統(任何其中返回地址存儲在堆棧中的文件系統)。這是因爲在孩子使用與父代相同的堆棧後,它可能會覆蓋功能(vforkclone或其他一些包裝)需要返回到父代的返回地址。

在彙編程序中,您只需在進行系統調用之前將返回地址保存在寄存器中。

+0

+1指出堆棧錯綜複雜。但爲什麼手冊非常隨意地指出'vfork()是clone(2)'的特例?這似乎表明''vfork''可以用'clone'實現? – 2012-04-06 13:03:17

+0

它可以很容易地用'clone' * syscall *實現。但是當你打算共享堆棧時,你不能像這樣打包C函數調用。您必須在asm中編寫'vfork'的基於克隆的版本。 – 2012-04-06 13:04:56

+0

所以如果我理解正確,離克隆函數最近的vfork就是我寫在第一篇文章中的調用?我得到了相同的內存空間,停止父節點,直到子節點退出,共享文件描述符表和相同的文件系統信息,但它們不像vfork那樣共享堆棧? – Andna 2012-04-06 14:01:38