도움받은 사이트 : http://blog.naver.com/dolzzo/130131251201

 

뭔가 간단한 프로그램을 짜고 있는데 프로그램 종료할 때마다 segmentation fault 가 뜨길래

디버깅해보니 육안상 이상이 없었다.

 

gdb 로 코어 뜨고 한참을 삽질한 끝에야 원인을 찾을 수 있었다.

 

나처럼 조인시위키 (https://www.joinc.co.kr/w/man/3/pthread_join) 를 통해 쓰레드를 익혔으면

아래 형태를 많이 봤을 것이다.

 

int status ;

pthread_join(thread, (void**)&status) ;

 

이 코드가 32bits OS 에선 이상이 없는데 64 bits OS 로 넘어오면서 문제를 일으킨다.

 

sizeof(void**) 값은 8인데 여기에 4Bytes 짜리 int 타입의 변수를 넣었기 때문에 메모리 충돌을 일으킨 것이다.

(64bits Linux 로 넘어온지 3년쯤 되는데 그동안 왜 아무일 없었던거지?)

 

해결책으론 아래와 같이 int 대신 long 을 쓰거나,

 

long status ;

 

아니면 아예 void* 로 선언하는 경우가 있겠다.

(앞으론 아래처럼 써야겠다.)

 

void* status ;

pthread_join(thread, &status) ;

 

참고로, 정보문화사의 Beginning Linux Programming (3판) 의 예제를 보면

아래와 같이 status 값을 확인하고 있다.

 

printf("status : %s\n", (char*)status) ;

 

 

+ Recent posts