2014-12-14 2 views
1

운영 체제를 배우고 있습니다. 이 코드를 테스트 할 때, 코어 덤프 (segmented fault)라는 문제가 발생합니다. 이 문제를 해결하는 방법?오류 : 분할 오류 코어가 덤프 됨

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <sys/types.h> 

int main() 
{ 
    int p,*stat_addr; 
    while((p=fork())==-1); 
    if(p==0) 
     exit(0); 
    else 
    { 
     wait(stat_addr); 
     printf("%d\n",*stat_addr); 
     exit(0); 
    } 
} 
+0

'stat_addr'가 초기화되지 않은 것입니다. – chux

+0

'wait'에 초기화되지 않은 포인터를 전달합니다. 그런 다음,'printf'를 호출하여 역 참조를합니다. 'int stat_addr;'...'wait (& stat_addr);와 같은 것을해야한다. printf ("% d", stat_addr);'. – ach

+1

초기화되지 않은 (정적이 아닌) 지역 변수를 사용하는 것으로부터 정의되지 않은 행동 외에도'main' 함수를 올바르게 정의하지 않았기 때문에 프로그램이 잘못되었습니다. –

답변

0

사용 :

int status; 
int corpse = wait(&status); 

시신은 죽은 아이의 PID (또는 -1 왼쪽 아이가없는 경우). corpse == -1이 아닌 경우 종료 상태는 status으로 인코딩됩니다.

초기화되지 않은 포인터가 있기 때문에 충돌이 발생합니다. 나는 당신이 wait() 함수의 프로토 타입을 혼동하고 의심 :

pid_t wait(int *stat_loc); 

예, 그것은 포인터를 걸리지 만 뭔가에 점으로 초기화 된 포인터이어야합니다. 또는 더 일반적으로는 int 변수의 주소입니다 (권장 주소 : &status).

1

stat_addr을 초기화하지 않았기 때문입니다. 같은 수행

int stat_addr = 10; 

를 한 다음 원하는 사용

wait(&stat_addr); 
+0

'_addr' 접미어는 더 이상 적절하지 않습니다 (당연히 작동합니다). 초기화는 무의미한 것처럼 보입니다. –

+0

감사합니다. @JonathanLeffler 난 방공호의 변수를 재사용하고 나는 당신과 동의합니다. – SMA