콘솔창 하나로 여러개의 콘솔인것처럼 사용할때 사용한다.

^A  :  명령모드

명령모드에서
C (sh create)
숫자 (sh간 이동)
N (Next sh)
A (windows Alt Tab)

screen -list
스크린 저장 상태보기

screen -dr [스크린번호]
해당 스크린으로 복귀

'Develop' 카테고리의 다른 글

Android의 시작  (0) 2010.04.24
[펌] Linux top명령어와 사용방법  (0) 2010.01.04
fopen 모드  (0) 2009.12.09
[링크] NAT 종류  (0) 2009.12.01
[펌] /usr/bin/python^M: bad interpreter: No such file or directory 에러  (0) 2009.11.27

w=쓰기용
r=읽기용
a=추가기입용
w+=읽고 쓰기 위한 텍스트(신규)
r+=일고 쓰기 위한 텍스트(오픈)
a+=읽고 쓰기 위해 추가 기입용으로 텍스트 파일을 오픈한다.
wb=쓰기용으로 바이너리 파일을 오픈
rb-읽기용으로 바이너리 파일을 오픈
ab=추가 기입용으로 바이너리 파일을 오픈

'Develop' 카테고리의 다른 글

[펌] Linux top명령어와 사용방법  (0) 2010.01.04
screen 명령  (0) 2009.12.22
[링크] NAT 종류  (0) 2009.12.01
[펌] /usr/bin/python^M: bad interpreter: No such file or directory 에러  (0) 2009.11.27
Linux Signal 목록  (0) 2009.11.24

'Develop' 카테고리의 다른 글

screen 명령  (0) 2009.12.22
fopen 모드  (0) 2009.12.09
[펌] /usr/bin/python^M: bad interpreter: No such file or directory 에러  (0) 2009.11.27
Linux Signal 목록  (0) 2009.11.24
vi 화면분할  (0) 2009.11.24

#!/usr/bin/python

리눅스 시스템에서 파이썬실행경로이다.

하지만 FTP를 이용해서 윈도우->리눅스로 파일을 전송하고나서 다시 리눅스에서 파이썬을 실행다보면 가끔 "/usr/bin/python^M: bad interpreter: No such file or directory"라는 에러를 뿌릴때가 있다.

그런데 vim이나 vi로 확인을 해보면 아무이상도 발견이 안될것이다.

 

그럴때는 vim -b이나 vi -b를 이용해보면 각 문장뒤에 ^M이 보이는데 이것만 없애주면 제대로

돌아간다.

 

아래의 명령을 실행해보자.

:1,$ s/^M//g
위 명령은 1행부터 마지막까지 "^M"를 찾아서 ""로 치환한다.

 

^M 은 Ctrl + v + M 
^[  은 Ctrl + v + [ 



출처 : http://blog.naver.com/uddum0425/20056216114

'Develop' 카테고리의 다른 글

fopen 모드  (0) 2009.12.09
[링크] NAT 종류  (0) 2009.12.01
Linux Signal 목록  (0) 2009.11.24
vi 화면분할  (0) 2009.11.24
[링크] 리눅스명령어  (0) 2009.11.19

* trap을 위해 사용되는 신호번호 


신호    내 용  

   1     HUP   hangup 
  2     INT   interrupt 
  3     QUIT  quit 
  4     ILL   
불법 명령어 
  5     TRAP  
추적 트랩 
  6     IOT   IOT
명령 
  7     EMT   EMT
명령 
  8     FPE   
부동소숫점 예외 
  9     KILL  
종료 
 10     BUS   
버스 에러 
 11     SEGV  
세그먼테이션 위반 
 12     SYS   
시스템 호출에 대한 불량 인수 
 13     PIPE  
기록한것이 없는 파이프상에서 판독 
 14     ALRM  
경보 클락 
 15     TERM  
종료(kill)로부터 소프트웨어 종료신호 
 16     USR1  
사용자 정의 신호
 17     USR2  
사용자 정의 신호
 18     CLD   
서브 쉘삭제


* signal_number와 이름

   1 SIGHUP(HUP) : hang up의 약자로 프로세스를 재시작시키는 시그널이다.
  2 SIGINT(INT) : 
인터럽트실행을 중지시킨다. [CTRL] + [C] 를 눌렀을 때 보내지는 시그널이다.
  3 QUIT        : 
실행중지
  9 SIGKILL(KILL): 
무조건 종료즉 강제 종료시키는 시그널이다.
 11 SEGV        : Segment Violation(
허가되지 않은 메모리 영역 접근)
 15 SIGTERM(TERM): Terminate
의 약자로 가능한 정상 종료시키는 시그널로 kill 명령의 기본 시그널이다.
 18 CONT        : Continue. STOP
등에 의해 정지된 프로세스를 다시 실행시킨다.
 19 STOP        : 
무조건적즉각적 정지
 20 TSTP        : 
실행 정지 후 다시 실행을 계속하기 위해 대기시키는 시그널이다. [CTRL]+[Z]를 눌렀을 때 보내지는 시그널.


일반적으로 사용되는 signal은 다음과 같다.

이름 번호 의미

HVP   1 Hangup (실행종료로그아웃 하거나 모뎀 접속을 끊을 때 보냄)

INT   2 Interrupt (실행종료. ^c를 쳤을 때 보내진다.)

QUIT  3 Quit (실행종료. ^8를 쳤을 때 보내진다.)

KILL  9 Kill (무조건 종료)

SEGV 11 Segmentation Violation (허가되지 않은 메모리 영역에 접근)

TERM 15 Terminate (가능한 한 정상 종료)

CONT 18 Continue (STOP나 TSTP에 의해 정지된 프로세스가 다시 실행을 계속한다.)

STOP 19 Stop (무조건적으로 그리고 즉각적으로 정지)

TSTP 20 Stop (실행을 정지 후 다시 실행을 계속하기 위해 대기.)


[출처] signal name|작성자 튤립정원

'Develop' 카테고리의 다른 글

[링크] NAT 종류  (0) 2009.12.01
[펌] /usr/bin/python^M: bad interpreter: No such file or directory 에러  (0) 2009.11.27
vi 화면분할  (0) 2009.11.24
[링크] 리눅스명령어  (0) 2009.11.19
ref와 out의 특징  (0) 2009.11.08
여러파일열고 :vsplit하면 됩니다

멀티 윈도우 기능
이 기능은 창을 분할해서 하나의 vi 에 여러 개의 파일을 보면서 편집할 수 있도록 해 주는 기능.
:sp :split :vsplit 로 창을 분할하거나 [ctrl]-wn 으로 창을 새로 만들 수 있음.
창간의 이동은 command 모드 에서 [ctrl]-ww나 [ctrl]-wk, [ctrl]-wj 등으로…
창을 닫을 때는 각 창에서 파일을 닫아도 되고 [ctrl]-wc 로 닫을 수 있슴.
:resize 등의 명령 [ctrl]-w+ [ctrl]-w- [ctrl]-w=등의 명령으로 창의 크기 의 조절

'Develop' 카테고리의 다른 글

[펌] /usr/bin/python^M: bad interpreter: No such file or directory 에러  (0) 2009.11.27
Linux Signal 목록  (0) 2009.11.24
[링크] 리눅스명령어  (0) 2009.11.19
ref와 out의 특징  (0) 2009.11.08
유니코드 소스코드 작성법  (0) 2009.11.05

'Develop' 카테고리의 다른 글

Linux Signal 목록  (0) 2009.11.24
vi 화면분할  (0) 2009.11.24
ref와 out의 특징  (0) 2009.11.08
유니코드 소스코드 작성법  (0) 2009.11.05
#define enumstr(a) (#a)  (0) 2009.11.05

C#은 call by value, reference가 있다.

call by reference는 ref, out 두가지가 있다.

ref와 out은 둘 다 참조로 전달된다.

ref와 out
ref는 함수 외부에서 함수 내부로 값을 전달할 때 사용하는 참조 키워드
out은 함수 내부에서 함수 외부로 값을 추출할 때 사용하는 참조 키워드

ref와 out의 미세한 차이
ref  변수는 반드시 초기화를 해야 하지만 out 변수는 초기화하지 않아도 된다.

호출하는측과 호출당하는측 모두 매개변수 앞에 ref와 out을 써줘야 한다.

-출처 : 소설같은 C#

'Develop' 카테고리의 다른 글

vi 화면분할  (0) 2009.11.24
[링크] 리눅스명령어  (0) 2009.11.19
유니코드 소스코드 작성법  (0) 2009.11.05
#define enumstr(a) (#a)  (0) 2009.11.05
error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.  (1) 2009.11.05

출처 http://blog.naver.com/noriggun/20009303911

아래의 글은 Jeffrey Richter 의 Programming Applications for MS Windows 4th edition중에 Part 1의 2장 Unicode 의 How to Write Unicode Source Code 부분을 번역해두었던 것을 올리는 것이다. (요즘 포스트가 뜸해서^^;;)

국내에 번역본이 출간된 걸로 알고 있지만 절판된 관계로 구해보지 못했고, 출판사도 망한 것으로 알고 있으며(다른 곳으로 흡수 합병 된 것인가?) 개인적인 용도로 번역해봤으므로 저작권에 문제가 있다고 생각되는 분이 있다면 리플 달아주세용

---------------------------------------------------------------------------------

유니코드 소스코드 작성법

 

마이크로소프트는 윈도우 API를 유니코드를 고려해 디자인하였으므로 유니코드는 프로그램 작성시에 많은 영향을 주지는 않는다. 실제로 하나의 소스코드만으로 유니코드를 사용하는 상황이든 아니든 컴파일이 가능하다.  사용자는 단지 두개의 매크로(UNICODE _UNICODE)로 유니코드 사용여부를 결정하고 재 컴파일 하면 된다. 

 

C 런타임 라이브러리에서의 유니코드 지원

 

유니코드 캐릭터 문자열을 사용하기 위해 몇가지 자료형(data type)이 정의되었다. 유니코드의 char 자료형인 wchar_t 를 정의하기 위해 표준 C헤더파일인 string.h 파일이 수정되었다.

typedef unsigned short wchar_t;

 

예를 들어, 99개의 캐릭터와 마지막 널 캐릭터로 된 유니코드 문자열을 저장할 버퍼를 생성하고싶으면 다음과 같이 할 수 있다.

wchar_t szBuffer[100];

위 문장은 wchar_t 16비트 자료형이기 때문에 16비트로 100개의 배열을 생성한다. 물론 strcpy, strchr, strcat 같은 표준 C 런타임 문자열 함수들은 8비트 ANSI 문자열에서만 동작하므로 위의 유니코드 문자열을 처리할 수 없다. 그래서 ANSI C또한 유니코드 처리용 함수들을 가지고 있다. Figure 2-1에서 같은 기능을 하는 표준 ANSI C문자열 함수와 유니코드 함수 몇가지를 보여준다.

 

Figure 2-1. Standard ANSI C 문자열 처리 함수들과 유니코드 버전

char * strcat(char *, const char *);

wchar_t * wcscat(wchar_t *, const wchar_t *);

 

char * strchr(const char *, int);

wchar_t * wcschr(const wchar_t *, wchar_t);

 

int strcmp(const char *, const char *);

int wcscmp(const wchar_t *, const wchar_t *);

 

char * strcpy(char *, const char *);

wchar_t * wcscpy(wchar_t *, const wchar_t *);

 

size_t strlen(const char *);

size_t wcslen(const wchar_t *);

모든 유니코드 함수 이름 앞에 wcs가 붙어 있는 것이 보인다. 이것은 wide character string의 약자로 유니코드 함수를 사용하기 위해선 ANSI문자열 함수앞의 str접두사를 단지 wcs로만 바꾸면 된다.

 

NOTE


개발자들이 간과하는 중요한 점이 하나 있는데, MS가 제공하는 C런타임 라이브러리들은 모두 ANSI 표준을 따른다는 것이다. ANSI C C런타임 라이브러리가 유니코드 캐릭터와 문자열을 지원하도록 요구하고 있다 이 것은 유니코드 캐릭터와 문자열을 다루기 위해서 언제나 C런타임 라이브러리 함수를 호출할 수 있다는 것을 의미한다. 다시 말해 윈도우98이라도 wcscat, wcslen, wcstok같은 함수들은 잘 작동한다. 

 

ANSI문자열과 유니코드 문자열을 위한 str함수나 wcs함수들을 소스코드상에 직접 호출하게 프로그래밍을 하게 되면 나중에 쉽게 컴파일하지 못하게 된다. 이 글 첫 머리에 하나의 소스코드로 ANSI문자열과 유니코드 문자열 모두를 지원하도록 컴파일 할 수 있다고 했는데, 이걸 가능하게 하려면 먼저 string.h 헤더 대신 tchar.h include 한다.

 

 tchar.h 헤더는 ANSI와 유니코드에 구애받지 않는 소스코드의 작성을 돕는 단 한가지의 목적을 위해 존재한다. str이나 wcs 함수들을 직접 호출 하는 대신 사용할 수 있는, 매크로들의 집합으로 구성되어 있는데, 소스에 _UNICODE를 정의(define)해 놓으면 매크로들은 wcs함수들을 사용하게 되며 _UNICODE를 정의하지 않으면 str함수들을 내부적으로 사용하도록 되어있다.

 

예를 들어 tchar.h 에는 _tcscpy라는 매크로가 있다. tchar.h include 하면서 _UNICODE를 정의하지 않는다면 _tcscpy ANSI strcpy 함수로 바뀐다. _UNICODE가 정의되어 있다면  wcscpy함수로 바뀌게 된다. C런타임의 모든 문자열을 인자로 받는 함수들은 tchar.h 에 매크로가 정의되어 있다. 코드를 작성할 때 ANSI/유니코드의 특정함수들을 직접 호출하는 대신 이러한 매크로들을 사용하게 된다면 ANSI나 유니코드에 구애받지 않고 쉽게 컴파일 되는 코드를 작성할 수 있게 될 것이다.

 

불행히 이러한 매크로의 사용 이외에 몇가지를 좀 더 해줘야한다. TChar.h 는 추가적인 매크로들을 몇가지 더 포함하고 있다.

 

ANSI/유니코드에 구애 받지 않는 문자열 배열을 정의하기 위해서는 TCHAR 자료형을 사용해야 한다. _UNICODE가 정의 되어 있다만 TCHAR 타입은 다음처럼 선언된다.

typedef wchar_t TCHAR;

 

_UNICODE가 정의되어 있지 않다면TCHAR는 다음처럼 선언된다.

typedef char TCHAR;

 

이런 자료형을 사용하면 문자열을 다음처럼 할당할 수 있다.

TCHAR szString[100];

 

문자열의 포인터도 생성할 수 있다.

TCHAR *szError = "Error";

그러나 위의 문장은 문제가 하나 있다. MS C++컴파일러는 디폴트로 “Error”같은 문자열을 유니코드가 아닌 ANSI스트링으로 간주해 컴파일 하게 된다. 따라서 _UNICODE가 정의되어 있지 않다면 컴파일러는 위의 문장을 제대로 컴파일 하겠지만 _UNICODE가 정의되어 있다면 위 문장은 에러가 된다. 문자열을 ANSI대신 유니코드로 사용하기 위해서는 위의 문장을 다음과 같이 작성해야한다.

TCHAR *szError = L"Error";

 “Error”문자열 앞에 붙어 있는 대문자 L은 컴파일러에게 해당 문자열을 유니코드로 컴파일 하도록 알려준다. 이렇게 하면 컴파일러는 문자열을 저장할 때 각 문자 사이사이에 0 byte들을 채워 넣어 2바이트로 만들게 된다. 문제는 이제 이 소스코드는 단지 _UNICODE가 정의되어 있을 때만 원하는 대로 컴파일 된다는 점이다. 그래서 이 대문자 L을 위한 또다른 매크로가 준비되어 있는데 바로 _TEXT가 그것이다. 역시 tchar.h 에 정의되어 있다.

_UNICODE가 정의된다면 _TEXT는 다음처럼 정의된다.

#define _TEXT(x) L ## x

 

_UNICODE가 정의되어 있지 않다면 아래와 같다.

#define _TEXT(x) x

이 매크로를 사용해서, 이제 위의 문장을 아래처럼 고치게 되면 _UNICODE 가 정의되든, 정의되지 않던지 올바르게 컴파일 할 수 있게 된다.

TCHAR *szError = _TEXT("Error");

 

_TEXT매크로는 문자리터럴에도 사용할 수 있다. 예를 들어 문자열의 첫번째 문자가 대문자 J인지 확인 하려면 다음과 같은 코드를 작성한다.

if (szError[0] == _TEXT('J')) {

   // 첫번째 문자가 'J'

 

} else {

   // 첫번째 문자가 'J'가 아님

 

}

 

윈도우에 정의된 유니코드 자료형

 

Window 헤더 파일들은 다음과 같은 자료형들을 정의한다.

Data Type

Description

WCHAR

유니코드 Char

PWSTR

유니코드 문자열 포인터

PCWSTR

상수 유니코드 문자열 포인터

위의 자료형들은 항상 유니코드 문자와 문자열들을 참조한다. Window 헤더 파일들은 ANSI/유니코드 자료형인 PTSTR PCTSTR도 정의하고 있다. 이 자료형들은 컴파일 할 때 UNICODE매크로를 정의 여부에 따라 ANISI문자열이나 유니코드 문자열을 나타내게 된다.

 

UNICODE 매크로 앞에 밑줄 _이 붙지 않은 점에 주의한다. _UNICODE매크로는 C런타임 헤더 파일에서 사용되고, UNICODE매크로는 윈도우 헤더 파일에서 사용된다. 소스코드를 컴파일 할 때 대개는 양쪽 모두 정의 해야 한다.

 

윈도우의 유니코드와 ANSI함수들

 

이전에 CreateWindowEx함수가 두가지가 있다고 언급했던 적이 있다. 유니코드 문자열을 인자로 받는 CreateWindowEx ANSI 문자열을 인자로 받는 CreateWindowEx가 있으며 실제로 두 함수는 아래와 같은 함수 원형이 있다.

HWND WINAPI CreateWindowExW(

   DWORD dwExStyle, 

   PCWSTR pClassName,

   PCWSTR pWindowName, 

   DWORD dwStyle, 

   int X, 

   int Y,

   int nWidth, 

   int nHeight, 

   HWND hWndParent, 

   HMENU hMenu,

   HINSTANCE hInstance, 

   PVOID pParam);

 

HWND WINAPI CreateWindowExA(

   DWORD dwExStyle, 

   PCSTR pClassName,

   PCSTR pWindowName, 

   DWORD dwStyle, 

   int X, 

   int Y,

   int nWidth, 

   int nHeight, 

   HWND hWndParent, 

   HMENU hMenu,

   HINSTANCE hInstance, 

   PVOID pParam);

CreateWindowExW CreateWindowEx 의 유니코드 버전이며 이름 끝에 붙은 W wide를 뜻한다. 유니코드 캐릭터는 ANSI 8비트보다 넓은 16비트이므로 wide 캐릭터라고 불린다. CreateWindowExA 함수의 끝에 붙은 대문자 A ANSI를 나타낸다.

 

하지만 일반적으로 코드상에서 CreateWindowEx를 사용하지 CreateWindowExW CreateWindowExA 함수를 직접 호출하지는 않는다. WinUser.h에 보면 CreateWindowEx 는 사실 다음과 같이 정의되어 있다.

#ifdef UNICODE

#define CreateWindowEx CreateWindowExW

#else

#define CreateWindowEx CreateWindowExA

#endif // !UNICODE

컴파일 할 때 UNICODE의 정의여부는 어떤 버전의 CreateWindowEx를 사용할지를 결정한다. 16비트 윈도우 애플리케이션을 포팅중이라면 이야기가 쉽다. 16비트 윈도우는 오로지 ANSI버전의 CreateWindowEx 만 제공하기 때문에 CreateWindowEx를 호출해도 ANSI버전인 CreateWindowExA 으로만 수행된다.

 

윈도우2000에서는, ANSI용 함수 CreateWindowExA는 단순히 인자로 넘어온 ANSI문자열을 유니코드 문자열로 변환하기 위해 메모리를 할당하는 변환 레이어가 된다, 함수가 호출되면 CreateWindowExW를 호출해서 변환된 문자열을 넘긴다. CreateWindowExW 함수에서 복귀할 때 CreateWindowExA는 할당했던 메모리버퍼를 해제한 후 윈도우 핸들을 리턴한다.

 

만약 다른 개발자가 사용할 DLL 라이브러리를 작성중이라면 위 방법의 사용을 고려해볼만 하다. DLL ANSI버전과 유니코드버젼, 두개의 함수를 제공한다면, ANSI버전에서는 단순히 메모리를 할당해서 문자열을 변환 한 후 유니코드버젼의 함수를 호출하는 것이다. (이 장의 마지막 부분에서 이러한 과정을 보여준다.)

 

윈도우98에서는 CreateWindowExA쪽이 그 일을 하는 함수다. 윈도우98도 유니코드를 파라미터로 받아들이는 함수를 모두 제공하지만 내부적으로 유니코드를 ANSI문자열로 변환하지는 않는다. 따라서 이들 함수 호출은 실패하며 GetLastError를 호출해보면 ERROR_CALL_NOT_IMPLEMENTED 를 반납한다. 윈도우98에서는 오로지 ANSI버전의 API함수들만이 제대로 동작하며 만약 컴파일된 프로그램이 와이드캐릭터 함수를 하나라도 호출한다면 윈도우98에서는 실행되지 않을 것이다.

 

윈도우 API중에 WinExec OpenFile같은 함수들은 단지 16비트 윈도우 프로그램과의 호환성을 위해서 존재하며 사용을 피해야 한다. WinExec OpenFile CreateProcess CreateFile로 바꿔 써야 한다. 저러한 옛날 함수들은 어쨌든 내부적으론 새로운 함수들을 호출하지만, 가장 큰 문제는 유니코드 문자열을 받지 않는다는 점이다. 저런 함수들을 호출 할 때는 ANSI문자열을 인자로 전달해야 한다. 이는 다르게 말하면 윈도우2000의 새로운 함수들은 모두 ANSI와 유니코드를 지원하는 버전이 둘다 존재한다는 것을 뜻하기도 한다.

 

윈도우 문자열 함수

 

윈도우는 또한 여러가지 문자열 함수들을 제공한다. 이 함수들은 strcpy wcscpy와 같은 C런타임 함수들과 비슷한데, 다른 점은 윈도우가 제공하는 함수들은 운영체제(OS)의 일부라는 점이며 많은 OS 컴포넌트들이 C런타임 함수 대신 이 윈도우 함수를 사용한다. 필자는 C런타임 문자열 함수보다 OS함수의 사용을 추천한다. OS의 문자열 함수들은 윈도우의 쉘 프로세스나 탐색기 같은 덩치 큰 프로그램에 주로 사용되며, 여기서 문자열 함수들은 아주 빈번하게 사용되어 메모리에 이미 로드되어 있을 확률이 높기 때문에, 제작하는 애플리케이션의 성능을 약간이라도 향상시키는데 도움이 된다.

 

이러한 함수들을 사용하기 위해서는 윈도우98 이상의 운영체제가 깔려 있어야 하며 4.0 버전 이상의 Internet Explorer 가 설치되어 있다면 그 이전의 윈도우에서도 사용할 수 있다.

 

전통적인 OS 함수 스타일처럼 OS의 문자열 함수 이름들도 대소문자가 혼합된 모양새를 하고 있다 : StrCat, StrChr, StrCmp, StrCpy… 이 함수들을 사용하기 위해서는 ShlWApi.h헤더파일을 include해줘야 한다. 그리고 전에 논의했 듯이 이 문자열 함수들 또한 StrCatA StrCatW같은 ANSI나 유니코드 버전이 된다. 이 함수들은 운영체제 함수이므로 프로그램을 빌드할 때 UNICODE(_UNICODE가 아닌)를 정의하게되면 와이드버전으로 바뀐다.


'Develop' 카테고리의 다른 글

[링크] 리눅스명령어  (0) 2009.11.19
ref와 out의 특징  (0) 2009.11.08
#define enumstr(a) (#a)  (0) 2009.11.05
error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.  (1) 2009.11.05
궁금해  (0) 2009.11.02

#define enumstr(a) (#a)

enum {RED, GREEN, BLUE};

printf("%s\n", enumstr(BLUE));

BLUE가 출력됩니다. 사실 BLUE가 열거형이 아니더라도 상관이 없습니다. 넘겨진 문자 리터러를 그대로 출력하거든요

출처 : http://blog.daum.net/sandwind/11244359

+ Recent posts