accept를 쓰레드로 분리해서 처리하는 프로그램을 만들어봤는데.

yhjj777의 이미지

분명히 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]
baram4x의 이미지

오류가 발생할 수도 있구요... 그렇지 않을수도 있습니다.

왜냐하면 해당 메모리에 접근이 가능하면 해당 메모리 주소의
값을 출력할 것이구요...

만약 접근이 불가능하면 세그먼트 폴트가 발생하죠..

그럼... 8)

arimae의 이미지

C 나 C++ 에서 배열의 첨자를 벗어나서 access 하였다고 Segmentation fault 가 일어 나지 않습니다. 정상적(?) 으로 그곳에 값을 저장하거나 읽어 오게 됩니다.

배열의 첨자를 벗어나는지의 체크는 프로그래머의 몫입니다.(자바처럼 배열 밖으로 벗어났다고 Exception을 발생시키지 않습니다.)

이점을 고려하시면서 프로그래밍을 하시는게 좋습니다.

Dream, Passion and Challenge..

김충길의 이미지

사용환경이 Linux인가요?
리눅스라면 메모리 관리가 좀 느슨한 편이라 세그폴트가 안날경우가 많을겁니다.

SunOS환경에서 테스트 해보세요.

초기화되지 않은 데이타 영역 다음이 Heap인 여기가 좀 공간이 있나 봅니다.

accept 들어가기 전에 메모리를 할당하는 코드를 추가해보시고요
루프가 끝나는데 곳에서 free 를 호출해보세요. 아마 세그폴트 날겁니다.

만약 안난다면 저도 책임을.. 못집니다. :D

screen + vim + ctags 좋아요~

skjk의 이미지

각 process에게 주어지는 segment의 범위는 실제 할당된 메모리범위이상입니다. 즉 할당된 메모리를 벗어낫더라도 process에게 주어진 segment범위 안쪽이라면 segment fault는 발생하지 않습니다.

자세한 내용은 OS관련 책 참고하세요~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.