-1

나는 fork()와 vfork()를 모두 시도하고 vfork로 fork 및 seg 오류로 float pt excep를 얻습니다. vfork()를 사용할 때 뚜렷한 이유가 없기 때문에 자식을 종료하지만 부모를 입력하지 않고 seg faults를 입력하지 않습니다. 내가 fork()를 사용할 때 부모에게 들어가지만 나에게 float pt excep를 준다. 어떤 아이디어?기본 fork() 프로그램은 seg fault 또는 부동 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<< 및 모든 종류의를 호출합니다. 그래서 그것은 효과가 없을 것입니다.

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입니다 : fork

, 당신은 0으로 나눕니다. 그래서 여기서 0으로 나눕니다.

+0

당신이 보여준 코드는 부모 기능입니다. 그것만이 (sum)을 수정하고 avg를 표시하기로되어있다. 아이는 (pID == 0). – user2782246

+0

@ user2782246. 그게 변화라고 생각하니? –

+0

아이 프로세스를 언급했지만 부모를 보여 주었기 때문에 나는 확신 할 수 없었습니다. – user2782246

1

당신은 부모의 코드 내에서 0으로 나누어됩니다

int avg = sum/i; 
(PID == 0)가 아이를 위해, 그리고 블록 경우

당신은 포크, 자식 프로세스는 원래의 클론으로 생성 될 때 프로세스를 실행하지만 별도의 주소 공간에서 변수 sum은 공유되지 않고 자식 및 부모에서 별도의 복사본을 가지며 공유되지 않습니다. 공유를 위해서는 메모리 또는 파이프를 공유해야합니다. 동일한 주소 공간에서 전역 데이터를 사용하려면 프로세스가 아닌 스레드를 작성/사용해야합니다.

+0

그래서 기본적으로 프로세스는 전역 변수에 변경 사항을 공유하지 않습니까? 나는 두 명의 내 옛 profs 물어 그들은 코드가 작동한다고 말했다. 왜냐하면 내가 fork()를 사용할 때 자식은 부모를 조인하지만 자식으로부터 값을 가져 오기를 거부하기 때문입니다. vfork()를 사용했을 때 자식 프로세스가 종료되었지만 부모 프로세스에 가입하지 않은 것처럼 보입니다. 당신은 공정으로 그것을 할 수있는 방법이 없다고 확신합니까? 스레드에 대한 전체 프 로그 램을 다시 실행하지 마십시오. – user2782246

+0

@ user2782246, 예 프로세스는 별도의 주소 공간에서 실행되지만 변수 사본을 복제했지만 본질적으로 공유 할 수없는 다른 변수입니다. 프로세스 간 통신 메커니즘을 위해 프로세스, 파이프 등에서 공유 변수를 읽으십시오. –

+0

@ user2782246 일부 공유 메모리 메커니즘을 사용해야합니다. 귀하의 운영 체제에는 아마도 그것들이 많이 있습니다. 당신은 fork하기 전에 파일을 메모리 맵핑 할 수 있고,'shm_open' 또는 몇몇 다른 메카니즘을 사용할 수있다. –