2016-08-05 66 views
-1

我想要實現的是以下內容: 產生一個新的子進程(pchild),它不會使用它自己的,但它的父進程(pparent) 。分叉子進程,不使用它自己的內存副本

爲什麼我要實現這種行爲: 想到多個測試,其中第一個導致segvault。 正常情況下,由於段錯誤,您的過程將停在此處,所有其他測試將不再執行。因此,我想在每個測試過程中包裝它們。

主要問題: 一旦我產生了一個進程,它會得到它自己的內存拷貝(嗯,我知道這個事實並不完全適用於所有操作系統,這是由於'拷貝寫入'技術)。想想如何測試樹functionallity我有一個節點結構,有兩個指針到其他節點。一旦我通過例如檢索節點使用一個管道或一些共享內存塊這些指針指向一個地址,這是pchild的內存塊的一部分,因此當我嘗試從父域通過遵循節點結構內的指針來獲取子節點時,我會得到一個segvault。

由於某些操作系統在發生段故障時的主要行爲,因此線程並非有用。 (由於「狀態不明」而導致孩子和父親死亡)。

我有什麼至今(僅叉測試部分):

int main (void) { 
    // forking 
    pid_t pid = fork(); 
    if (pid < 0) { 
     // somewhat went wrong 
     printf("An error occured!"); 
    } else if (pid != 0) {        // inside parent 
     // closing writing end, as not needed 
     if(wait(NULL)!=0){ 
      printf("Segfault in Child\n"); 
     } else { 
      printf("Everyone is done!\n"); 
     } 
    } else { 
     printf("Child forked"); 
     char *s = (char *)0xDEADBEEF; 
     *s = 'a'; 
     printf("this probally is never executed due to segfault\n"); 
    } 
    return 0; 
} 

現在我的想法是儘量讓pchild只能訪問pparent的內存段。 我很歡迎有關如何這樣做的任何想法。 問候, 拉爾斯

+1

你確定你需要這個嗎?如果一個測試崩潰,進行進一步測試有什麼意義? – fuz

+1

如果你在Linux上,你可以通過'clone()'來實現這個瘋狂的方案。 – EOF

+0

fork_and_exec gdb並將其附加到主進程。 – joop

回答

2

你的問題不是很清楚,但我認爲你有一個XY problem

我的理解是,您希望運行一系列測試,其中每個測試都能看到先前測試成功的結果,但不會測試崩潰/失敗。如果是這樣的話,一個辦法是:

  1. fork每個測試
  2. 之前在孩子執行測試。
  3. 如果測試成功,請讓父母退出或等待小孩再次分叉,並在其子女中執行下一個測試。如果測試失敗,請再次嘗試下一個測試。

另一種方法可能是讓你的數據結構只通過mmapMAP_SHARED|MAP_ANON分配的共享內存,但這時如果一個測試留在了不一致的狀態,未來所有的測試結果將是垃圾。

您在進程間共享所有內存的想法在技術上是可行的,但它會立即炸燬,因爲它們會打斷對方的狀態。

+0

嗯,這個答案沒有那麼有用。首先第一步和第二步是我想做的事情。它有什麼問題,正在恢復一個很好的返回值。由於父母和孩子有分開的記憶,所以返回一個包含指針(並在孩子中分配)的結構從孩子到父母都會混淆一切。因爲這些指針會導致chield mem,所以一旦我在父母身份中跟着他們,我會得到一個段錯誤... –

+0

大多數測試不會互相累積! - 忘了說,對不起! –

+1

@LarsPrehn:如果您只想將結果從子項返回給父項,則通過管道發送它們或使用共享的mmap。這就是爲什麼我說你有一個XY問題 - 你在問怎麼做一個非常複雜的黑客攻擊,以便用具有明確定義的行爲的標準工具來實現簡單的事情。 –

0

每個進程都有它自己的virtual memory地址空間,因此無法將RAM地址提供給另一個進程(您可以發送一個數字,但在另一個virtual memory地址空間中它將指向不同的「真實」地點)。

所有你需要的是另一個線程。同一進程的線程共享一個virtual memory空間。

+0

「每個進程都有自己的虛擬內存地址空間,因此無法將RAM地址提供給其他進程」 - 最終不是這樣!請參閱mmap ...「您所需要的只是另一個線程,同一進程的線程共享一個虛擬內存空間。」 ......正如我在我的問題中所陳述的,線程根本沒有幫助。如果我不知道這樣做,我怎麼能設置這個問題? –

-2

嘗試使用vfork();而不是fork(); systemcall。 共享父進程和子進程的資源。

+0

由於'vfork()'是''exit()'或'exec()'後孩子可能執行的唯一允許的操作,所以它對於OP的幫助並不明顯。 – EOF