2012-04-28 157 views
0

我在fork和它的寫入系統上有一些麻煩。 我將創建params.writersCount處理,並在每個我需要獲得其內部ID(從1到params.writersCount)。所以在孩子我正在等待父進程,初始化孩子內部id(作家[我] = processId)。然後我可以調用writerSimulation並傳遞參數的上下文地址,因爲在context.id中現在是正確的內部id,因爲在寫系統上覆制(context.id = j + 1會強制unix複製頁面,所以每個孩子然後使用其內部ID擁有上下文副本)。但是,如果我嘗試在writerSimulation函數中使用context.id,我得到0.我做錯了什麼?分叉和共享頁面

for(int i = 0; i < params.writersCount; i++) 
{ 
    pid_t processId = fork(); 

    if(!processId) 
    { 
     srand((unsigned int)(seconds+getpid())); 
     while(!context.id) 
     { 
      for(int j = 0; j < params.writersCount; j++) 
      { 
       if(writers[j] == getpid()) 
       { 
        context.id = j+1; 
       } 
      } 
      struct timespec wait = {.tv_sec = 0, .tv_nsec = 500000}; 
      nanosleep(&wait, NULL); 
     } 
     int simError = writerSimulation(&context); 
     return simError; 
    } 

    writers[i] = processId; 
} 
+0

請寫出標準英語,包括首都。 – thb 2012-04-28 15:05:09

回答

0

對我來說這並不完全清楚,但它看起來像你試圖讓父母修改孩子中的作家數組。這是行不通的。在fork之後,父進程的任何寫入操作都不會在子進程中看到,因爲寫入時副本適用於子進程和父進程。而且,使用nanosleep等待甚至不是可靠的。與子進行通信的一種簡單方法是在fork之前打開管道並將其用於同步和傳遞數據。只需讓父母將數據寫入管道即可。孩子讀取而不是納米睡眠,所以讀取提供了同步。

+0

aaa,所以如果複製寫入適用於兩個,那麼該程序無法正常工作,thx人 – Krab 2012-04-28 18:55:09

0

您不能在子女訪問 分支後由父級分配的值。有幾個選項:

  • 變化所以這個不需要你的整體方法 - 依靠叉前可用或在兩個父母和孩子後,獨立獲得的信息。

  • 使用進程間通信-sockets,管道,共享存儲器的裝置等