블로그 이미지
Terapi

calendar

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
2009.11.08 01:07 Softwere

전 6.0에 이어서 2003 2008까지 써봤는데 2010도 나왔네요
개발자와 함께하는 Window Visual studio 2010 Beta 2

다운로드
Microsoft visual Studio 2010 Beta2

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Softwere' 카테고리의 다른 글

visual studio 2010 Beta 2 다운로드  (0) 2009.11.08
프로세스 관리  (0) 2009.09.26
posted by Terapi
2009.10.17 14:38 Softwere/sample code

Segmentation fault
Submitted by mach on 화, 2003/06/10 - 10:39am.

메모리 관리
1) 세그멘테이션 : 메모리를 가변길이로 나누어 관리
2) 페이징 : 메모리를 고정크기로 나누어 관리
이렇게 2가지로 크게 나누어 볼수 있습니다.
둘다에 대한 상세한 설명은 피하기로 하고 주관심사인 segmentation fault에 대해서만 언급하겠습니다.

운영체제가 메모리를 관리할때 여러가지 작업을 수행해야 하며 특히, 메모리 보호를 하게 되어 있습니다.
메모리 보호란, 각각의 프로세스가 자신이 소유한 메모리에 대해서만 액세스하도록 하는것입니다. 즉, 다른 프로세스(심지어는 운영체제영역)의 영역에는 침범할 수 없다는 것이지요. 마치 파일시스템에서 자기 소유가 아닌 디렉터리나 파일에는 쓰기, 읽기등이 안되거나 하는 것같은 메커니즘이지요.
A라는 프로그램이 메모리 영역 100번지에서 200번지 까지를 사용하도록 운영체제에 의해 허가되었다고 가정합시다(모든 메모리자원은 운영체제에게 할당받아 사용해야함) 그런데, A라는 프로그램내부에서 10번지나, 210번지등 자신의 메모리 영역이 아닌곳을 액세스하고자 하면, 운영체제는 해당 프로그램 즉 A를 죽여버립니다.(살벌하지요?) 왜 그러냐면 210번지를 B라는 다른 프로그램이 사용하고 있었다면, A는 B의 영역을 침범한것이 되지요? 이것을 운영체제 수준에서 막아주게 되어 있습니다. 어떻게요? 죽여버리지요.
즉, 자신의 영역이 아닌 부분을 액세스(read또는 write)하려고 했기 때문입니다.
침범하도록 허용한다면? 문제가 있겠지요? A때문에 B도 죽을 수 있기 때문입니다. 만일 B 가 운영체제라면 시스템이 다운되겠지요? 구한말의 도스처럼.

이렇게 어떤 프로그램이 자신이 운영체제로 부터 배정받지 못한 영역(메모리)에 대해 침범하는 것을 운영체제 수준에서 막아주는 것이 세그멘테이션 폴트에러 입니다.
그럼 왜 이를 메모리 에러 등의 메시지로 안했냐구요? 이는 일종의 전통이라고 볼수 있습니다. 관습이랄까요? 최초 유닉스 설계자의 문구가 지금도 사용되는 것이라고 볼수 있습니다. 이를테면 core dump도 있는데, core메모리 이거 지금은 쓰는데가 있을라나? 다 RAM계열을 사용하지! 요즘 말로 이것도 바꿔본다면, 메모리덤프, 또는 RAM덤프등으로 써야 하겠지요?

또 한가지, 요즘의 마이크로프로세서(하드웨어, CPU라고 흔히불리는...)들은 대부분 기본적으로 메모리 관리 메카니즘을 내장하고 있습니다. 인텔계열의 경우 386프로세서 이상에서 부터 지원되었지만요. 이를 운영체제 만드는 사람들이 이용하면 보다 쉽게 메모리 보호등 메모리 관리 루틴을 만들 수 있지요. 하드웨어가 메모리 보호를 지원하지 않아도 구현이야 할 수 있습니다만, 프로그램 수행이 좀 (아니 아주많이) 느려지겠지요?

끝으로, 프로그래머가 세그멘테이션 폴트를 발생시키려고 하지 않았는데, 발생하는 주 이유는 무엇일까?에 대해 말씀드리겠습니다.
여러 이유가 있겠지만, 첫번째는 초기화 입니다.
char *pointer; //알수없는 번지값이 들어가 있음, 무슨 값이 들어가 있는지는 며느리도 모름

pointer = (char *)0;
이런식으로 초기화 하지 않으면, pointer라는 변수에 이상한 값(즉, 번지)이 들어가게 되고 해당 번지는 알수 없는 번지가 되지요. 그리고는 그번지를 액세스하는 순간, 에러가 발생하겠지요?

또다른 이유는 메모리 할당 성공 실패 검사입니다.
메모리할당은 유닉스의 경우 실패할 경우가 거의 없겠지만, 그래도 메모리 할당후 검사는 필수적입니다.
pointer = (char *)malloc(10);
if ( pointer == (char *)0)
{
// 메모리 할당에러
}
이런 루틴을 추가하는 것은 기본입니다.

또한가지는 할당한 메모리를 초과하는 영역을 액세스하는 경우입니다.
10바이트 할당한 포인터에 다음과 같이 하는 경우이지요.
*(pointer+100) = 'a';
당근으로 죽겠지요.

또다른 한가지는 배열에서도 발생할 수 있습니다.
int a[10];

a[100] = 8;
물론 100이라는 값을 인위적으로 쓸리는 없지만, 루프를 사용하고 100이라는 index(subscript)를 변수에 넣어 사용할때는 흔히 실수가 나오기도 합니다.
a[cnt++] = 8;
모 이런식으로 하다보면 흔히 실수하지요.

============================================================================================================
폴트에 대해 얘기가 빠졌네요.
Fault란 무엇일까?
사전적의미로 봐서는 안되고요. 용어로 보시면됩니다.
Exception에는 Trap, Fault, Abort가 있습니다.
1)trap : 현재 명령라인에서 다른 수행루틴을 호출
2)fault : 현재 명령라인이 실패하면, 폴트처리루틴(fault handler)을 수행한후, 이전라인으로 복귀
3)abort : 현재 명령라인이 실패하면 중지

세그멘테이션 폴트 즉, 다른 프로세스 영역에 쓰기를 시도했다면, 쓰고 나서 죽어서는 안되겠지요? 쓰기 이전상태로 메모리는 보전되어야 하고, 그 후 죽거나 어떤 처리를 수행해야 겠지요? 그래서 폴트라는 것을 사용합니다.
참고로, 폴트는 가상메모리(Virtual Memory Management)에서도 사용되는 메커니즘입니다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
2009.09.26 01:02 Softwere
XM  
 

리눅스는 유닉스와 같이 멀티테스킹 운영체제이이다. 윈도우에서 음악을 들으면서 인터넷을 할 수 있는 것과 같은 것을 멀티테스킹이라고 한다. 즉 동시에 둘 이상의 프로그램을 실행시키는 것을 의미한다. 따라서 리눅스에서는 프로세스관리가 매우 중요하다.

13.1 포그라운드와 백그라운드

리눅스에서 지원하는 프로세스 생성방법에는 두가지가 있다. 쉘에서 단순히 명령을 실행시키는 것은 대부분 포그라운드에서 프로세스를 띄우는 것이다. 포그라운드는 기본 실행 모드로 표준입력(키보드)와 표준출력을 지원한다. 포그라운드로 실행을 하면 쉘은 그 프로세스가 종료되기를 기다렸다가 종료가 되면 다시 쉘 프롬프트를 띄워주게 된다.
이에 반하여 백그라운드로 프로세스를 실행시키면 쉘은 프로그램의 종료와 관계없이 바로 프롬프트를 보여둔다. 즉 백그라운드는 쉘 뒤편에서 계속실행되고 있는 것이다. 쉘에서는 다시 새로운 프로세스를 실행할 수가 있다. 이런식으로 여러개의 프로그램을 실행시키는 것이다.

다음은 백그라운드로 프로그램을 실행시키는 방법이다.

$ command &

실행하고자 하는 명령어 뒤에 '&' 문자를 입력하면 해당 프로그램은 백그라운드로 실행되게 된다. 리눅스에서는 프로그램을 백그라운드로 실행시키면 그 다음에 작업번호와 프로세스 번호를 보여준다.
백그라운드에서 실행되는 프로그램은 표준입력을 받을 수 없다. 그래서 백그라운드 프로세스는 장시간 입력값이 없이 실행되는 프로그램 실행에 알맞다. 그러나 백그라운드 프로그램도 표준출력과 에러는 공유한다. 따라서 백그라운드 프로그램의 출력값이 포그라운드 프로그램의 결과에 섞여 곤란해지는 경우가 발생한다. 이를 방지하는 방법은 출력 리다이렉션을 사용하는 것이다.

$ command > file &

그러면 file에 command의 모든 출력내용이 기록된다.

13.2 백그라운드로 전환하기

현재 포그라운드로 실행중인 프로그램을 백그라운드로 실행시켜야 할 필요가 있을 것이다. 이를 위해서는 'bg' 명령을 사용한다.
우선 현재 실행중인 프로세스를 중지시킨다. <Ctrl> + <Z>
그 다음 bg를 실행시킨다.

13.3 포그라운드로 전환하기

백그라운드에서 실행중인 프로그램을 포그라운드로 올려놓기 위해서는 'fg'라는 명령어를 사용한다. 단순히 fg만 실행시키면 가장 최근의 작업을 포그라운드로 돌려놓는다. 특정 프로세스를 포그라운드로 전환하고 싶으면 fg %<작업번호>를 입력한다.
작업번호는 'jobs'라는 명령어로 확인한다.

13.4 프로세스 죽이기

가끔식 프로세스를 강제로 종료시켜야 할 때가 있다. 포그라운드에서 실행되는 프로그램은 <Ctrl> + <C>를 이용해 종료시킬수 있다. 그러나 백그라운드에서 실행중인 프로그램은 그렇게 할 수가 없다.
이때 kill이라는 명령을 사용하게 될 것이다. 이 명령은 프로세스에게 정해져 있는 시그널을 보냄으로서 프로세스와 통신을 하는 것으로 다음과 같이 사용한다.

$ kill <PID>
또는
$ kill %<작업번호>

이는 단순히 15번 시그널을 보내는데 대부분의 프로세스는 이 시그널을 받으면 종료하도록 되어있다. 그러나 어떤 이유로 죵료되지 않는 프로세스가 있을 수 있다. 이 프로세스는 9번 시그널을 보내야 하는데 9번 시그널은 그 어떤 프로세스도 거부할 수 없는 막강한 시그널이다.

$ kill -9 <PID>

13.5 프로세스 확인

리눅스 명령어 중 많이 사용되는 명령어가 바로 ps 명령어이다. 이 명령어는 현재 실행중인 프로세스 목록을 보여주는데 단순히 ps만 입력하면 현재 로그인한 사용자가 실행시킨 프로세스만 보여준다. 전체 사용자의 프로세스를 보고 싶으면 a 옵션을 사용한다.

이것으로서 리눅스 기초 부분을 마칠까 한다.
여러분은 적어도 리눅스 설치, 그리고 간단한 관리와 명령어를 알고 있는 셈이다. 이제 중급 리눅서로의 한발을 내딛어 보자.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Softwere' 카테고리의 다른 글

visual studio 2010 Beta 2 다운로드  (0) 2009.11.08
프로세스 관리  (0) 2009.09.26
posted by Terapi
2009.09.23 05:00 Softwere/sample code

ftw(), nftw()라는 file tree walking(traversing) 함수가 있습니다. SUS에 속해 있죠.
http://www.opengroup.org/onlinepubs/9699919799/
기본적으로는 pre-order traverse입니다만, 옵션을 줘서 post-order로 traverse할 수 있습니다.

#nclude
#include
#include

static int rmdir_helper(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf)
{
 switch ( tflag )
 {
  case FTW_D:
  case FTW_DP:
   if ( rmdir(fpath) == -1 )
    perror("unlink");
    break;
   
  case FTW_F:
  case FTW_SL:
   if ( unlink(fpath) == -1 )
    perror("unlink");
   break;
  default:
  puts("do nothing");
}
return 0;

}

 
int main(int argc, char* argv)
{
const char* dir_to_remove = "/path/to/remove";
int flags = 0;
flags |= FTW_DEPTH; // post-order traverse

if ( argc == 2 )
dir_to_remove = argv[1];
if (nftw((dir_to_remove, rmdir_helper, 10, flags) == -1)
{
perror("nftw");
exit(EXIT_FAILURE);
}
return 0;
}


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
2009.09.02 22:01 Softwere/sample code
리눅스에서 코딩하다가 itoa를 쓸일이 있었는데 리눅스 내장함수에는 atoi는 지원하지만 itoa는 지원하고 있지를 않다. 왜~~~~ 라고 한다면 알아서 코딩하라고 하겠지... 밑에 형님들이 ANSI C로 코딩해뒀다 책에 있는 내용을 첨부한다.

/**
 * Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C":
 */


void strreverse(char* begin, char* end) 
{
        char aux;
        while(end>begin)
               aux=*end, *end--=*begin, *begin++=aux;
}

 

void itoa(int value, char* str, int base) 
{
        static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
        char* wstr=str;
        int sign;
        if (base<2 || base>35)
        { 
               *wstr='\0'; 
               return; 
        }

        if ((sign=value) < 0) 
               value = -value;
        do 
               *wstr++ = num[value%base]; 
        while(value/=base);

        if(sign<0) 
               *wstr++='-';
        *wstr='\0';

        strreverse(str,wstr-1);
}
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
2009.08.26 01:05 Softwere/sample code

strcat.....

요즘 ftp소스를 짜고있다..
매우 짜증나면서도 ftp 에 대한 이해와 네트워크 상에서의 데이터 통신기법에 대해서 매우 많은걸 느끼면서 배우고 있다.

그런데 몇일간 나를 힘들게 했던 에러......

메모리 에러가 뻥뻥터진다.. 머 테스터가 있었다면(그럴리는 없겠지만....) 더 많은 양질(?)의 조언과 무수히 많은 테스트결과를 주겠지만 그정도는 바라지도 않는다...

먼저 strcat 를 살짝알아보자

헤더 string.h
형태 char * strcat( char *dest, const char *src);
인수
char *dest 연결될 문자열
char *src 연결할 문자열
반환 2개의 문자열을 합쳐진 문자열을 반환

머 간단하다
두개의 문자열을 하나의 문자열로 합쳐주는 기능을 한다.
의외로 ftp소스를 구현중에 많이 짜는데 이유는 ftpserver와 ftpclient상에서 명령어의 조합을 위해서이다

예를 들어 client에서 server의 파일을 받고싶다면

CLI Ftp> get aaa.avi

명령어를 실행해야할것이다

내부적으로는 get 명령어를 받아드려서 뒤에 파일명을 server에서 받아드릴수 있는 server명령어 RETR명령어로 변환해줘야한다

그럼

strcat("RETR ","1.avi");
이렇게 해주어서 서버에게 socket정보를 가지고 write를 해주면 된다.

하지만.........
이런명령어들말고  write할때 버퍼의 데이터끝에 \r\n를 해줘야하는 명령어들이 간혹있다
그러기 위해서 strcat("PORT ","\r\n);  을 써줬다



우왝...  이런 에러 ㅠㅠ  GGGG  아직모르겠다 왜 strcat에 \r\n을 쓰면안되는지...................




















신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
2009.07.14 23:19 Softwere/sample code


c++책은 서점가면 정말 많다

객체지향이 어쩌고 객체가 어쩌며 구조체에서 어케어케해서 클래스의 비교차이를 보여준다.

특히 클래스를 설명을 잘들어보면 구조체에서는 어쩌고저쩌고 했는데 함수의 기능을 추가함으로 인해서 솰라솰라....

책에는....

어떤책은 클래스와 객체는 서로 다른 개념이며, 객체의 소통으로 프로그램을 구성한다.

어떤책은 클래스를 생성해 메모리에 상주시키고, 절차지향으로 조합하는게 객체지향이다.

어떤책은 객체에 클래스를 포함 시킬수 있고, 클래스에 객체를 넣어 프로그램을 만든다.

어떤책은 클래스는 곧 객체요, 클래스의 소통으로 이루어진게 객체지향형 프로그램이다.

제길.. 말장난하냐?

어떤책은 저자는 같은데 클래스에 대한 내용은 틀리다...



신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
2009.01.31 06:28 Softwere/sample code

저수준 file 입출력의 read/write –disk user가 설정한 buffer에서 자료를 읽고쓴다.

Buffer file입출력의 getc/putc fgets/fputs

-       시스템이 설정한 buffer user가 정한 변수와의 사이에서 자료를 읽고 쓴다

-       Buffer disk간의 자료를 읽고 쓰는 것은 시스템이 필요에 따라서 (buffer empty full일 때)자동적으로 행한다

입출력 함수 분류표

   

   

   

(메모리내)

문자열

저수준

 

표준파일

(표준 입출력에 대한 I/O)

스트림파일

(file 입출력에 대한 I/O)

바이너리파일

문자

입력

getchar()

getc(stream)

 

 

gfetc(stream)

 

 

출력

putchar()

putc(c,stream)

 

 

fputc(c,stream)

 

 

unget(c,stream)

 

 

입력

(stdin 으로 부터 문자열을 str로 시작되는 버퍼에 읽어드린다)

\n 대신에 \0가 부가되어 저장

gets(str)

fgets(buf, max, stream)

 

read(fd, buf,nbyte)

단어

getw(stream)

 

블록

fread(ptr, size, nitems,stream)

 

출력

(str로 보인 버퍼에 기억된 문자열을 stdout에 출력한다.)

\0 을 만나면 \n으로 바꿔서 출력

puts(str)

fputs(buf, stream)

 

write(fd, buf,nbyte)

단어

putw(w,stream)

 

블록

fwrite(ptr, size, nitems,stream)

 

레코드

입력

scanf(format,[args])

fscanf(stream, format,[args])

sscanf(str, format,[args])

 

출력

printf(format,[args])

fprintf(stream, format,[args])

sprintf(str, format,[args])

 

파일

열기

(자동)

fopen(filename,mode)

 

 

freopen(filename,mode,stream)

 

 

fdopen(fd,mode)

 

 

닫기

(자동)

fclose(stream)

 

 

fflush(stream)

 

 

탐색

(자동)

fseek(stream,offset,mode)

 

open

ftell(stream)

 

close

rewind(stream)

 

lseek(fd,offset, mode)

 


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
2009.01.04 23:30 Softwere/openCV

1. CvArr* image : 변환을 할 이미지가 들어간다.

2.  void* line_storage : 라인을 저장할 공간

3. int method : 허프변환에는 4개의 방법이 있다 .

#define CV_HOUGH_STANDARD 0
#define CV_HOUGH_PROBABILISTIC 1
#define CV_HOUGH_MULTI_SCALE 2
#define CV_HOUGH_GRADIENT 3



4. double rho / double theta : 이 둘은 얼마나 조밀한 단위(?)를 사용할 것인가를 정하는 인자 이다.

                                         예로 rho=1이라면 1픽셀단위로 조사를 하고 theta = PI/180 이라면 1도 단위로 조사를 하겠다는 뜻

5. int threshold : 허프 공간상에 그려지는 곡선들이 중첩되는 부분을 이용해서 직선을 검출하는데 threshold 값보다 중첩되
                            는 갯수가 많으면 직선으로 간주한다는 뜻이다. 숫자가 커지면 당연히 더 직선의 기준이 엄격하게 된다.

6.double param1 : CV_HOUGH_PROBABILISTIC 일 경우  직선의 최소 길이를 설정할 수 있다.

7.double param2 : CV_HOUGH_PROBABILISTIC 일 경우 직선의 최대 길이를 설정할 수 있다

 


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Softwere > openCV' 카테고리의 다른 글

cvHoughLines2  (0) 2009.01.04
Opencv 설정하기  (0) 2008.06.14
visual studio 2005 와 openCV 연동하기  (1) 2008.06.14
posted by Terapi
2009.01.02 02:36 Softwere/sample code
인자로 사용하는 변수의 양식 인자는 값형변수 , 참조형 변수로 나뉠수 있다. 인자 전달 방법은 이러한 인자의 형식에 따라 달라짐
인자 전달방법
1. 값에 의한 전달(인자가 값형 변수 일 때)
2. 값에 의한 전달(인자가 참조형 변수 일 때)
3. 참조에 의한 전달(인자가 값형 변수 일 때)
4. 참조에 의한 전달(인자가 참조형 변수일 때)

1.값에 의한 전달(인자가 값 형 변수 일 때) 1) c# 에서 일반적인 사용방법 2) 인자로 사용하는 변수를 메소드에 그대로 전달하는 방식
namespace Param1
{
    using System;
    public class ParamValue
    {
        public void Increase(int n)
        {
            n++;
        }
        public static void Main(string[] args)
        {
            int i = 10;
            ParamValue pv = new ParamValue();
            Console.WriteLine("호출전: {0}", i);
            pv.Increase(i);
            Console.WriteLine("호출후: {0}", i);
        }
    }
}

2.값에 의한 전달(인자가 참조형 변수 일때)
1)참조형변수란 변수명을 통해서 값이 아닌, 변수의 저장된 메모리를 참조하는 변수를 말한다.
namespace Param2
{
    using System;
    public class ParamRef
    {
        public int myVal = 10;
    }

    public class Paramtest
    {
        public static void Increase(ParamRef VarRef)
        {
            VarRef.myVal++;
        }
        public static void Main(string[] args)
        {
            ParamRef pr = new ParamRef();
            Console.WriteLine("호출전: {0}", pr.myVal);
            Paramtest.Increase(pr);
            Console.WriteLine("호출후: {0}", pr.myVal);
        }
    }
}
1- Pr pr은 ParamRef 클래스형 변수 Pr을 생성하였다. Pr은 특정값을 포함한 변수가 아니라, ParamRef 클래스를 참조하는 참조형 변수다.
3.참조에 의한 전달(인자가 값형 변수 일때) 1)참조에 의한 전달방식은 인자로 사용된 변수 값이 아닌 참조를 전달하는 방식을 의미한다. 결국 참조형 변수를 인자로 사용하는 방식과 같은 원리
namespace Param3
{
    using System;
        public class Paramvalue
    {
        public void Increase(ref int n)
        {
            n ++;
        }
        public static void Main(string[] args)
        {
            int i = 10;
            Paramvalue pv = new Paramvalue();
            Console.WriteLine("호출전: {0}", i);
            pv.Increase(ref i);
            Console.WriteLine("호출후: {0}", i);
        }
    }
}
 
4.참조에 의한 전달(인자가 참조형 변수일때)
namespace Param4
{
    using System;
    public class ParamRef
    {
        public int myVal = 10;
    }

    public class ParamTest
    {
        public static void Increase(ref ParamRef VarRef)
        {
            VarRef.myVal++;
        }
        public static void Main(string[] args)
        {
            ParamRef pr = new ParamRef();
            Console.WriteLine("호출전: {0}", pr.myVal);
            ParamTest.Increase(ref pr);
            Console.WriteLine("호출후: {0}", pr.myVal);
        }
    }
}
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi
prev 1 2 next

티스토리 툴바