2014-09-26 50 views
-1

我已經嘗試fork()和vfork(),並獲得一個浮點pt與fork和seg錯誤與vfork。因爲沒有明顯的理由,當我使用vfork()它退出孩子,但沒有進入父母,然後seg故障。當我使用fork()它進入父級,但給我一個浮動pt excep。有任何想法嗎?基本fork()程序返回seg故障或浮動pt異常

#include <iostream> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <sys/wait.h> 

    int sum = 0; 
    int i = 0; 
    pid_t pID; 

    int main() 
    { 
     pID = vfork(); 
     if (pID > 0) 
     {  
       std::cout<< "b4 NULL"<< i<< "__"<< sum << std::endl; 
       wait(NULL); 
       std::cout<< "after NULL"<< i<< "__"<< sum << std::endl; 
       int avg = sum/i; 
       std::cout<<avg; 
     }  
     else if (pID == 0) 
     {  
       int J = 0; 
       std::cout<<sum<<"__"<<i<<std::endl; 
       i=0; 
       sum=0; 
       std::cout<<"enter a num:"; 
       std::cin>>J;  
     while(J != -1) 
     {  
       sum += J; 
       std::cout<<"enter a num:"; 
       std::cin>>J; 
       i++; 
     }  
     //int avg = sum/i; 
     //std::cout<<avg; 
     std::cout<<"exit child"<< i << "__" << sum << "__" << sum/i << std::endl; 
     //return(sum); 

     } 
     else 
     { 
      std::cerr << "Failed to fork" << std::endl; 
      return 1; 
     } 

     return 0; 
    } 

回答

2

這裏不能使用vfork

」 ...的行爲是未定義的,如果()要麼由vfork的創建的流程修改)比用於存儲從vfork的(返回值的類型將爲pid_t的可變其他任何數據,或返回從調用vfork()的函數中調用或調用任何其他函數,然後成功調用_exit()函數或某個exec函數系列函數之一。 - vfork

你的孩子修改數據,調用operator<<和各種東西,都是不允許的。所以這是行不通的。

隨着fork,你除以零:

int i = 0; 
pid_t pID; 

int main() 
{ 
    pID = fork(); /* changed to fork */ 
    if (pID > 0) 
    {  
      std::cout<< "b4 NULL"<< i<< "__"<< sum << std::endl; 
      wait(NULL); 
      std::cout<< "after NULL"<< i<< "__"<< sum << std::endl; 
      int avg = sum/i; /* division by zero */ 

無需更改代碼i,並i的價值是零。所以你在這裏除以零。

+0

您顯示的代碼是我父母的功能。它只能修改(總和)並顯示平均值。孩子是(pID == 0)。 – user2782246 2014-09-26 05:19:52

+0

@ user2782246對。你認爲這會改變什麼嗎? – 2014-09-26 15:04:11

+0

我只是不確定,因爲你提到我的孩子的過程,但顯示父母。 – user2782246 2014-09-29 22:27:33

1

你被零父代碼內劃分:

int avg = sum/i; 

如果塊(PID == 0)是孩子,當你叉,子進程創建爲原始的克隆正在運行的進程,但在單獨的地址空間中,可變總和不會共享,而是在子級和父級中有單獨的副本,不共享。對於共享,您需要我們共享內存或管道,要在同一地址空間使用全局數據,您需要創建/使用線程而不是進程。

+0

所以基本上過程不會共享全局變量的變化?我問了幾個我的老教授,他們說代碼應該可以工作。因爲當我使用fork()時,孩子加入父母很好,但拒絕從孩子的值。當我使用vfork()子進程退出但似乎沒有加入父。你確定沒有辦法與流程做到這一點嗎? id而不是重做線程的整個prgram。 – user2782246 2014-09-26 05:15:02

+0

@ user2782246,是進程在單獨的地址空間中運行,它們具有克隆副本的變量,但實質上它們是不能共享的不同變量。讀取進程之間的共享變量,管道等進程間通信機制 – 2014-09-26 07:18:59

+0

@ user2782246您必須使用一些共享內存機制。你的操作系統可能有很多。您可以在分叉之前對內存映射文件,可以使用'shm_open'或其他幾種機制。 – 2014-09-26 15:05:11