2014-09-26 43 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