accept를 쓰레드로 분리해서 처리하는 프로그램을 만들어봤는데.
글쓴이: yhjj777 / 작성시간: 수, 2003/01/22 - 4:42오후
분명히 5개의 integer형 배열을 만들었는데
그 이상의 첨자로 엑세스가 가능하네요...
제 생각으로는 잘못된 메모리를 참조했으니
세그멘테이션 에러가 뜨는게 정상인거같은데..
뜨질않으니 당황스럽네요.. -_-; g++, gcc로
컴파일을 해도 같은 상황이 발생하거든요.
왜 이러는지 좀 알려주세요.
#include <pthread.h> #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h> unsigned int sockListener; unsigned int sockClients[5]; void* AcceptThread( void * arg ); int main( int argc, char * argv[] ) { sockaddr_in addr; int dummy; pthread_t th_accept; addr.sin_family = AF_INET; addr.sin_port = 6000; addr.sin_addr.s_addr = INADDR_ANY; sockListener = socket( AF_INET, SOCK_STREAM, 0 ); dummy = bind( sockListener, (struct sockaddr *)&addr, sizeof( addr ) ); dummy = listen( sockListener, 512 ); pthread_create( &th_accept, NULL, AcceptThread, (void *) NULL ); while(1) { sleep(3); printf( ".\n" ); } return 0; } void* AcceptThread( void * arg ) { printf( "AcceptThread() \n" ); sockaddr_in addr; socklen_t sockLen; static int idx = 0; while(1) { sockLen = sizeof( sockaddr_in ); sockClients[idx] = accept( sockListener, (struct sockaddr *) &addr, &sockLen ); if( sockClients[idx] > 0 ) { printf( "client connected : %d\n", sockClients[idx] ); printf( "idx = %d\n", idx ); printf( "sockClients[10] = %d\n", sockClients[10] ); idx++; } else { printf( "accept error!! : %d \n", sockClients[idx] ); idx--; } } }[/code]
Forums:
[답변] accept를 쓰레드로 분리해서 처리하는 프로그램을 만들어
오류가 발생할 수도 있구요... 그렇지 않을수도 있습니다.
왜냐하면 해당 메모리에 접근이 가능하면 해당 메모리 주소의
값을 출력할 것이구요...
만약 접근이 불가능하면 세그먼트 폴트가 발생하죠..
그럼... 8)
C 나 C++ 에서 배열의 첨자를 벗어나서 access 하였다고 Segm
C 나 C++ 에서 배열의 첨자를 벗어나서 access 하였다고 Segmentation fault 가 일어 나지 않습니다. 정상적(?) 으로 그곳에 값을 저장하거나 읽어 오게 됩니다.
배열의 첨자를 벗어나는지의 체크는 프로그래머의 몫입니다.(자바처럼 배열 밖으로 벗어났다고 Exception을 발생시키지 않습니다.)
이점을 고려하시면서 프로그래밍을 하시는게 좋습니다.
Dream, Passion and Challenge..
사용환경이 Linux인가요?리눅스라면 메모리 관리가 좀 느슨한 편이라
사용환경이 Linux인가요?
리눅스라면 메모리 관리가 좀 느슨한 편이라 세그폴트가 안날경우가 많을겁니다.
SunOS환경에서 테스트 해보세요.
초기화되지 않은 데이타 영역 다음이 Heap인 여기가 좀 공간이 있나 봅니다.
accept 들어가기 전에 메모리를 할당하는 코드를 추가해보시고요
루프가 끝나는데 곳에서 free 를 호출해보세요. 아마 세그폴트 날겁니다.
만약 안난다면 저도 책임을.. 못집니다. :D
screen + vim + ctags 좋아요~
각 process에게 주어지는 segment의 범위는 실제 할당된 메모리
각 process에게 주어지는 segment의 범위는 실제 할당된 메모리범위이상입니다. 즉 할당된 메모리를 벗어낫더라도 process에게 주어진 segment범위 안쪽이라면 segment fault는 발생하지 않습니다.
자세한 내용은 OS관련 책 참고하세요~
댓글 달기