-1

我已经尝试了 fork() 和 vfork() 并得到了一个带有 fork 的 float pt excep 和一个带有 vfork 的 seg 错误。当我使用 vfork() 时,没有明显的原因,它会退出子进程,但不会进入父进程,然后出现 seg 错误。当我使用 fork() 时,它进入父级,但给了我一个 float 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;
    }
4

2 回答 2

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' 值为零。所以你在这里除以零。

于 2014-09-26T03:49:11.083 回答
1

您在父代码中除以零:

int avg = sum/i;

if (pID == 0) 块是给子进程的,当你 fork 时,子进程被创建为原始运行进程的克隆,但在单独的地址空间中,变量 sum 不共享,而是在其中有单独的副本孩子和父母,不共享。对于共享,您需要我们共享内存或管道,要在同一地址空间中使用全局数据,您需要创建/使用线程而不是进程。

于 2014-09-26T03:56:29.193 回答