예전것/프로그래밍2009. 6. 19. 17:05

(char*)&c == &c
c가 char형일때 위와같다. (char*)는 char형으로 주소 형변환을 하겠다는 의미이다.
(char*)&c +1
(int*)&c +1
은 다른 결과를 나타낸다. int형주소에 정수를 더하면 4byte씩 증가하고 char형은 1byte씩증가한다.


예제1
int n = 0x11223344;

printf("%x\n", *(char*)&n);
printf("%x\n", *(short*)&n);
printf("%x\n", *(int*)&n);

이 예제의 결과

44
3344
11223344

윗줄 프린트문에서 (char*)로 주소 형변환을 하였다. &n은 int형 주소지만 (char *)에 의해 char형으로 형변환이 된다. 이때 1byte의 공간을 * << === 가리키는 값은 44 (n에 저장된값은 16진수이다. 따라서 뒤에 두자리만.)
이렇게 메모리에 저장하는 방식을 little_endian이라한다.
44
33
22
11
메모리에 이렇게 저장함.
카테고리 없음2009. 6. 19. 15:52
파워코드가 없을때 - 인사는 Hello로 하자

what's your problem?

uh.. I lost  my power code in airplane.. do you have power code?

I don't have any power code for laptop.
uhm... I'm sorry that I don't have any idea for this problem

I think she misunderstood what you said
I'm sorry
bye ..


인터넷 설정을 바꿔야할때

some of reason of this problem
I have to change your laptop configuration

May I change it?
카테고리 없음2009. 6. 15. 16:58

Learning 배운다.
Flooding 모르면 들어온 포트를 제외한 다른 모든 포트로 뿌린다.
Forwarding 해당 포트로 건네준다.
Filtering 다른 포트로는 못건너가게 막는다.
Aging 나이를 먹는다.

1 Learning
어떤 pc a가 통신을 위해서 프레임을 내보내면 브리지는 이때 이 pc의 맥 어드레스를 읽어서 자신의 맥 어드레서 테이블에 저장해 놓는다.(브리지 테이블 이라고 말함)

2 Flooding
들어온 주소가 브리지 테이블에 없는 주소면 어느 세그먼트 에 속한것인지 모르므로 이때 나머지 모든 포트로 뿌려주게 되는데 이것을 Flooding 이라고 말한다.

3 Forwarding
목적지가 어디인줄 알고있는데 그 목적지가 브리지를 통해서 가야하는 경우 즉, 다른 세그먼트 상에 위치해 있는 경우에 Forwarding이 발생한다.

4 Filtering
같은 세그먼트 상에 위치한 pc와 통신을 하기 위해서는 브리지를 건널 필요가 없다. 브리지는 콜리전 도메인을 나눈다고 했는데 바로 이 Filtering으로 콜리전 도메인을 나눌수 있다. 같은 세그먼트 상에 위치한 pc와 통신을 할때 브리지를 건너는 것을 차단하는 것

5 Aging
어떤 맥 어드레스를 브리지 테이블에 저장하고 나면 타이머 가 작동해서 일정시간(디폴트 5분) 이 지나도록 그 출발지 주소를 가진 프레이미이 들어오지 않으면 테이블에서 삭제 시킨다.



카테고리 없음2009. 6. 12. 22:27

제목에 있는 3개의 함수 malloc, callc, realloc에대해 알아보자..
이 3개의 함수중 malloc 즉 '말록' 함수는 아래와 같이 앞서 배열과 포인터 부분에 잠시 나온 적있다.
int *arr = (int*)malloc(sizeof(int) * 3);

여기서 따로 설명한다고 적었는데.. 이는 말록만 있는게 아니라 씨알록과 리알록 이 존제하기 때문이다.
우선 이 함수의 원형은 아래와 같다.

void* malloc(size_t size);
우선 기능 부터 알아보자면.. size로 입력받은 바이트만큼 (3을 넘겼으면 3바이트) 메모리를 생성후 시작 주소를 넘겨주는 애가 바로 이 말록 함수다. 그런데 앞에 void 같은데 어찌 넘겨준다는것일까.. 잘 보면 반환형 부분이 일반 void가 아니라 void의 포인터형이라는 것을 알 수있다. 그냥 void는 아무것도 없음을 의미하지만. void 포인터는 특정형식이 없음을 의미한다. 즉,, int가 올수도 있고 char이올 수도 있고 그밖의 자료형이 올 수도 있다. 반환형이 void 포인터인 이유는 어떤 데이터가 들어갈지 모를 메모리의 주소를 넘겨주기 때문이다.(어떠한 값이든 메모리의 주소는 숫자로 되어있다) 그럼 이 값을 어떻게 사용할까.. 바로 사용할려하면 형변환에러가 뜨므로 안된다. 그러나 이외로 방법은 간단하다. 명시적으로 형변환을 시켜주면 된다.(void 포인터가 어떠한 자료형도될 수 있기 때문에 가능하다) int면 int로 형변환을 시켜주면 된다. 다음은 사용 예이다.
char* str = (char*)malloc(sizeof(char) * 10);
str = "ABCDEFGHI";
char c = str[1];

위를 컴파일 해서 실행해보면..
1.문자하나를 담을 수 잇는 메모리가 연속으로 10칸 생기고.. 주 시작 주소를 문자형 포인터 변수 str에 넘겨주고.
2.1번에 의해 str은 10칸의 문자형 배열의 시작 주소를 가지며
3.str이 가리키는 곳부터 시자갛여 "ABCDEFGHI"를 입력하고.. 마지막 바이트에는 \0(NULL 문자)이 들어가고
4.그중 두번째 값을 문자형 변수 c에 넣게 된다.

여기서 중요한 것은 char이 1바이트이고, 영문자(알파벳)도 1바이트이나 한글은 2바이트라서.. 위 배열에 영문자는 9글자가 들어갈 수 있으나 한글은 그렇지 않을 수 있다는 것이다.

그리고 malloc과 비슷하나.. 배열친화적인 기능을 하는 함수가 있다.
그 함수는 calloc함수로 원형은 이렇다.
void* calloc(size_t num, size_t size);
첫번째 파라미터는 메모리의 갯수가 들어가고 두번째 파라미터는 메모리의 크기가 들어간다.
즉 calloc(3,sizeof(int)); 하면 int형의 크기인 2바이트 짜리 메모리가 3개 생성된다. 뿐만 아니라 calloc함수는 셍성된 모든 메모리를 0으로 초기화시키고 그 시작 주소를 넘겨준다. 따라서 calloc(3, sizeof(int)); 하면 2바이트 메모리를 3개 생성한후 0으로 초기화 시키고 그 시작주소를 넘겨주게 된다.
malloc에 나온 예제를 calloc으로 고치면 아래와 같아진다.
char* str = (char*)calloc(10,sizeof(int));
str = "ABCDEFGHI";
char c = str[1];

마지막으로 realloc 함수가 있는데 이 함수는 이럴때 쓴다... 배열을 사용하다가보면 배열내 메모리가 부족하거나 남아도는 경우가 있다... 이럴때 realloc함수를 이용하여 크기를 재 설정할 수 있다 이 함수의 원형은 아래와 같다.
void* realloc(void* memory, size_t size);
첫번째 파라미터에 크기를 조정할 메모리의 주소(포인터)를 넣고, 두번째 파라미터에 조정할 크기를 적는다.
str = (char*)realloc(str,20); 이라고 하면 기존 str 배열의 메모리 갯수가 10개에서 20개로 늘어난다. realloc 사용시 주의 할 점은.. 크기를 늘릴때는 기존에 있던 데이터들을 그대로 유지한채 늘어나지만.. 줄일때는 줄어든 부분만큼은 소실되기 때문에.. 조심해야 할것이다.

마지막으로.. 배열이 메모리가남거나 부족하다고 malloc함수나 calloc 함수를 사용하여 재 할당 하면 기존의 메모리는 미아가 되 어떠한 방법으로도 접근할 수 없게 되 쓰레기가 되므로 (나중에 이게 쌓이면 메모리 부족현상이 나타난다) 재할당하지말고 realloc함수를 이용하여 크기를 조정하도록 하자..

출처 : 네이버
카테고리 없음2009. 6. 11. 22:41


Hello world는 식상하다 별찍기! ㅋㅋ
카테고리 없음2009. 6. 11. 20:34

리눅스에서는 정렬할수있는 sort 명령어를 제공한다.

: 구분자로 구분된 어떤 데이터 파일을 특정 필드로 정렬하고 싶다. 할때는

sort -t: +1 -2 filename 이런식으로 써준다.

-t 다음에 오는 값은 구분자로 사용될 값을 써주고 +1은 비교대상값.. (두번째 필드부터 1이다.)

-2는 이경우에 만약 두번째(+1)을 비교해서 값이 같으면 2(즉 세번째 필드)를 이용해서 정렬을 하라는 뜻.

#cut 명령
 - 문자열에서 필드를 추출
 - 문자열은 파이프라인을 통해 cut으로 전달된다.
 - 필드는 문자열을 구분자로 파싱하거나, 문자열 내의 필드 위치를 명시하여 위치를 지정할 수 있다.
 - 예
  $ echo "abc:def:ghi" | cut -d':' -f2
  def
  $
  -d':' 옵션은 cut 명령이 콜론 문자를 구분자로 사용하도록 지시하고, -f2 옵션은 cut 명령이 두번째 필드를 추출한다.

  $ echo "abc:def:ghi" | cut -c5-7
  def
  $
  문자열의 위치를 5~7의 문자 위치로 지정한다

 

카테고리 없음2009. 6. 10. 16:38

/string        히스토리 목록의 위로 방향으로 검색
?                히스토리 목록의 아래쪽 방향으로 검색

행에서의 이동
h   왼쪽으로 이동
l    오른쪽으로 이동
j    아래쪽으로 이동
k    위쪽으로 이동
b    한 단어 뒤로 이동
e또는 w 한단어 앞으로 이동
$    행의 끝으로 이동

vi를 사용한 편집
a 텍스트추가
i 텍스트 삽입
dd dw x 텍스트를 삭제하고 버퍼로 보냄
cc C 텍스트 수정
u U 편집 수정
yy Y 복사하여 버퍼에 저장
p P 복사나 삭제로 인해 버퍼에 저장된 내용을 현재 행의 아래나 위에 붙여넣기
r R 한문자나 여러 문자를 치환

$# 위치인자 개수..
/$$# --> /$는 달러기호 출력 $ $#은 위치인자 개수 4개라 치면 4
카테고리 없음2009. 6. 8. 17:59

쉘 스크립트는 일반적으로 편집기에서 작성하며, 그 내용은 주석과 명령어로 구성되어있다.

스크립트의 첫번째 행에서 맨 왼쪽에는 스크리브를 수행할 쉘의 이름을 다음과 같이 적는다.

#!/bin/bash

기호 #!는 매직넘버라 불리며 커널이 실행 프로그램으로 인식해야하는지 여부를 알려주기 위해 사용한다. 이것은 항상 스크립트의 첫 행에 나와야 한다.
예전것/Linux Basic2009. 6. 8. 10:46
1.  화면에 로그인 프롬프트가 나오기 전에 어떤 과정이 이루어지는가?
1 최초로 구동되는 프로세스는 PID 1의 init 프로세스이다.
2) 이 프로세스가 getty프로세스를 실행시킨다.
3) 이 프로세스들은 터미널 포트를 열어, 표준 입력과 표준 출력 그리고 표준 에러의 방향을 설정한 후, 화면에 로그인 프롬프트를 띄운다.

- 추가
이어서 /bin/login 프로그램을 실행하면 패스워드를 요구한다. 입력된 패스워드를 암호화해서 확인한 후에 초기 환경을 설정하고, 패스워드 파일의 맨 마지막에 기록되어 있는 사용자 쉘(/bin/bash)을 실행시킨다.
1) 배시는 시스템 파일인 /etc/profile을 찾아서 그 안의 명령어들을 실행시킨다.
2) 그런 다음, 사용자의 홈 디렉토리에서 초기화 파일인 .bash_profile의 내용을 읽어 들인다.
3) .bash_profile에 설정된 내용들이 수행되고 나면 기본 프롬프트인 달러 기호($)가 화면에 나타난다.
 배시쉘이 사용자의 명령을 기다리는 것이다.

2. HOME, LOGNAME, PATH 변수의 설정은 어떤 과정에서 이루어지는가?
사용자의 홈 디렉토리에 있는 .bash_profile 파일을 실행(source)시킨다. 이 파일에서는 별명, 함수, 환경변수 및 시작 스크립트등을 설정하거나 정의한다.

3.현재 사용하고 있는 쉘을 알 수 있는 방법
$echo $SHELL (현재 사용하고있는 쉘 알수 있는 명령어)
/bin/bash

4. 로그인 쉘을 변경 하기 위해 사용하는 명령어는 무엇인가?
일반 사용자는 다음과 같은 명령으로 로긴쉘을 바꿀 수 있고, 바꾼 내용은
다음번 로긴시부터 적용됩니다. (source /etc/passwd는 안되네..)
$ chsh  (쉘 바꾸는 명령어)
Changing shell for test_user. 
Password: (........) 
New shell [/bin/bash]: /bin/tcsh 
Shell changed. 
$
이 때 사용자가 쉘로서 사용할 수 있는 프로그램의 리스트를 알아야 하는데,
그 내용을 담고있는 파일은 /etc/shells 입니다. (`chsh -l` 명령으로 확인이
가능합니다.) 이 파일에 열거되어있지 않은 프로그램을 지정하려 하면 에러를
내면서 설정되지 않지만, 혹여 설정이 된다고 해도 시스템 사용에 부분적으로,
또는 전반적으로 문제가 있을 수 있습니다. (시스템 설정 등에 따라 다릅니다.)
 
5. 로그인 쉘은 어느 파일에서 지정하는가?
/etc/passwd 에서 지정한다. (왜그런지는 1번 문제 답 참고)

6./etc/profile과 ~/.bash_profile의 차이점은 무엇인가? 어느 파일이 먼저 실행되는가?
/etc/profile 은 사용자가 로그인할 때, 시스템 전체적으로 공통된 초기화를 위해 관리자가 설정하는 파일이다.
이 파일은 배시 쉘이 시작할 때 실행되며, 시스템 상의 모든 본 쉘과 콘 쉘 사용자들에게 적용된다.
~/.bash_profile 파일은 개별 사용자에게 적용, ~/.bash_profile 파일을 사용자의 홈 디렉토리에서 찾으면 /etc/profile 다음에 읽어 들인다.

7. .bash_profile 파일을 다음과 같이 수정하라
a. 환영 메시지를 보낸다. 
 - echo "Hello ~~ "
b. 사용자의 홈 디렉토리가 경로에 포함되어 있지 않으면 포함시킨다.
 - export PATH=$PATH:$HOME (포함되어 있지 않으면?? 그건 잘..)
c. stty 명령어를 사용해 백스페이스에 삭제 기능을 설정시킨다.
stty erase ^H 를 써주면 사실 되야하는데 안된다. 백스페이스를 누르면 이때부터 ^? 가 나오기시작... 
stty erase ^?를 넣어주면 원래대로 작동
 
d. source .bash_profile을 입력한다. 여기서 source 명령어의 기능은 무엇인가?
 - source(.) 명령어 이명령어는 스크립트의 이름을 인자로 갖는다. 스크립트는 현재 쉘의 환경에서 실행된다. 즉, 자식 프로세스를 새로 새성하지 않고 스크립트를 실행한다. 스크립트 내에서 정의된 모든 변수들은 현재 쉘 환경의 일부가 되며, 마찬가지로 현재 쉘에서 정의한 모든 변수들도 스크립트 환경의 일부가 된다.

8. BASH_ENV파일은 무엇인가? 이파일은 언제 실행되는가?
- CentOS에서는 보이지 않았았다.
배시 2.0 버전 이전에는 BASH_ENV 파일을 콘 쉘에서처럼 ENV파일이라고 불렀다. BASH_ENV(ENV)변수는 ~/.bash_profile 파일에 설정되어있다. 이변수에는 대화형 배시쉘이나 배시 스크립트가 시작할 때마다 실행할 파일이름을 지정한다. BASH_ENV(ENV)파일에는 특수 배시 변수와 별명들이 들어 있다. 이 파일의 이름은 관례상 .bashrc로 사용한다.

9. 주 프롬프트의 기본값은 무엇인가?
 - /etc/bashrc에 정의되어있는 PS1 [\u@\h \W]\$   이게 기본값  - \u는 유저 이름 \h는 호스트 이름 \W는 현재 작업디렉토리
a. 현재시각과 사용자의 홈디렉토리를 포함하도록 주 프롬프트를 변경시켜라
현재시각을 나타내는 것은 \T와 \t가 있다.
PS1="\T \W"

b. 보조 프롬프트의 기본값은 무엇인가? 이 프롬프트의 기능은 무엇인가?
기본은 > 어디정의 되어있는지는 모름. echo $PS2하면 나오긴하네..
기능은 명령어를 제대로 입력하지 않았을때 나타나는 역할

10. 다음 설정이 의마하는 바는 무엇인지 각각 설명하라
a. set -o ignoreeof - ^d를 사용하여 로그아웃하는것을 막는다. 로그아웃을위해 exit써야함
b. set -o noclobber - 리다이렉션에 의한 파일 덮어쓰기 방지
c. set -o emacs      - emacs 사용
d. set -o vi             - vi 사용





'예전것 > Linux Basic' 카테고리의 다른 글

emacs의 설정  (0) 2009.07.16
리눅스에서 키설정 & 디버깅  (0) 2009.07.16
NFS 간단설정  (0) 2009.07.12
.bash_profile , hash  (0) 2009.06.04
CentOS netinstall  (0) 2009.05.22
카테고리 없음2009. 6. 4. 21:17
쉘에서 작업할 때는 디렉토리의 위, 아래로 이동하여야 하는 경우가 무척 잦다. 이 경우 자주 이동하는 디렉토리를 디렉토리 스택(directory stack)이라고 하는 곳에 넣어두면 편리하게 이동할 수 있다. 내장 명령어 pushd를 사용하여 스택에 디렉토리를 삽입하고, popd명령어를 사용하여 삭제(pop)한다. 디렉토리 스택에서는 왼쪽의 디렉토리가 최근에 입력된 디렉토리이다. dirs 명령어를 사용하면 스택 내의 전체 디렉토리 목록을 출력할 수 있다.

pushd popd 해본것