파일의 링크

Programming/Linux 2009. 10. 8. 01:17

심볼릭 링크
: 새로운 inode의 원본파일포인터가 원본파일을 가리킨다.

- 바로가기 아이콘과 비슷
- 사용자가 많이 사용
- 긴 디렉토리명을 이동시 유용함 : /aa/bb/cc/dd 를 자주 이동 할 때 ln -s /aa/bb/cc/dd abcd 를 하게되면 cd abcd 를 하게되면 /aa/bb/cc/dd 로 이동 할 수 있다
- 윈본을 다른 곳으로 이동시키면 사용 못함
- 새로운 inode 를 생성
- 원본의 삭제시 링크가 끊긴다
- 파일시스템이 달라도 관계없다


하드 링크
: 링크 대상의 inode 와 같은 inode를 가리킨다.

- 동일한 inode 사용
- 원본 수정시 하드링크도 수정된다
- 원본 삭제시 살아 있다
- 원본의 이동이나 삭제시 남아 있음
- 동일한 파일시스템에만 적용됨
- 파일복사와 차이는 공간을 차지하지 않는다.


'Programming > Linux' 카테고리의 다른 글

시스템 정보 보기  (0) 2009.10.08
vi 사용( 명령어 )  (0) 2009.10.08
기본 명령어  (0) 2009.10.08
리눅스란?  (0) 2009.10.08
[Kernel 2.6]프로세스 스케쥴링  (0) 2009.09.22

설정

트랙백

댓글

기본 명령어

Programming/Linux 2009. 10. 8. 01:06
ls : 디렉토리에 있는 파일의 목록을 보여줌

ex )
ls : 현재 디렉토리의 파일 목록
ls /usr/bin : /usr/bin/ 디렉토리의 목록 - 절대 경로기 때문에 어디서 해든 관계없다.
ls -a : 현재 디렉토리의 목록( 숨김 파일 포함 )
          - .bash-profile 처럼 점이 앞에 있을 경우 숨김 파일이다
ls -l : 현재 디렉토리의 목록을 자세히 보여줌
ls *.txt : 확장자가 txt인 목록을 보여준다 - *.txt.* :a.txt.gz 같은 파일을 찾을 수 있다.
ls -l /usr/bin/a* : /usr/bin 디렉토리에 있는 목록중 앞글자가 a'a인 것의 목록을 자세히

옵션은 중복 지정 가능 하다 ( 예 : ls -al )



cd : 디렉토리 이동 명령어

ex )
cd : 사용자의 홈 디렉토리로 이동
cd ~john : john 사용자의 홈 디렉토리로 이동 ( 대개 /home/john/ )
cd .. : ".." 은 현 디렉토리의 부모 디렉토리를 의미
cd /usr/bin : "/usr/bin" 디렉토리로 이동( 절대 경로 )
cd /root -> cd ../usr/bin : 상대 경로로 이동 = cd /usr/bin
  - 부모 디렉토리로 갔다가 usr, bin 으로 이동



mkdir : 새로운 디렉토리를 생성
생성된 디렉토리는 명령어를 수행한 사용자의 소유가 된다.

ex )
mkdir abc : 현재 디렉토리 아래에 abc 라는 디렉토리 생성
mkdir -p def/fgh : 헌재 디렉토리 아래에 def 디렉토리를 생성하고, 그 안에 fgh 를 생성



touch

touch abc.txt - 파일이 없을 경우에는 빈 파일 생성하고 있을 경우에는 파일의 수정 날짜를 변경



rm : 파일이나 디렉토리 삭제 명령어
해당 파일이나 디렉토리에 삭제 권한이 있어야 한다( root 사용자를 제외 하고 )

ex )
rm abc.txt : 그냥 삭제
rm -i abc.txt : 삭제시 확인
rm -r abc : 디렉토리 삭제
rm -rf abc : abc 디렉토리와 그 하부를 강제로 전부 삭제
rm -ir abc : 디렉토리 삭제시 확인



mv : 파일과 디렉토리의 이름변경이나 위치이동 때 사용

ex )
mv aaa bbb ccc ddd : 이동. ddd는 디렉토리
mv abc.txt test.txt : 이름 변경



cp : 파일이나 디렉토리 복사 명령어
새로 복사한 파일은 사용자의 소유가 된다

cp abc.txt cba.txt : cba.txt가 새로 생성되면서 복사
cp -r abc cba : 디렉토리를 생성하고 복사




cat : 텍스트로 작성된 파일을 화면에 출력

ex )
cat abc.txt



more : 텍스트로 작성된 파일을 화면에 페이지 단위로 출력
space 키는 다음 페이지, b 는 앞 페이지

ex )
more abc.txt : 한페이지만 보여주고 멈춰있고, space와 b 를 눌러줘서 페이지를 옮기고, q 를 눌러서 종료.



ln : 링크를 만들어 준다

ex )
ln -s aaa.txt bbb.txt : 심볼릭 링크
ln aaa.txt bbb.txt : 하드링크

'Programming > Linux' 카테고리의 다른 글

vi 사용( 명령어 )  (0) 2009.10.08
파일의 링크  (0) 2009.10.08
리눅스란?  (0) 2009.10.08
[Kernel 2.6]프로세스 스케쥴링  (0) 2009.09.22
명령어( 폴더, 파일 관련 )  (0) 2009.09.19

설정

트랙백

댓글

리눅스란?

Programming/Linux 2009. 10. 8. 00:35
리눅스란 커널 자체를 말한다.( 커널 = 하드웨어와 소프트웨어의 연결다리 ) 그래서 이 자체만 가지고는 사용할 수 있는 사람이 적으므로, Linux 커널에다가 GNU S/W 와 X윈도우, 기타 Application 을 포함한 것을 리눅스 배포판 이라고 칭한다. 배포판에는 Red Hat, Ubuntu, SE 등이 있다.

리눅스 공개버전 과 상용버전 이 있는데, 둘의 차이는 없으나 상용버전을 사용하게 되면 서비스를 받을 수 있다고 한다. 일반적으로, 기업에서 사용을 한다고 한다.

커널소스 숫자
linux-x.y.z.tar.gz 형식
x : 주버전
y : 홀수 - 베타, 짝수 - 안정
z : 버그수정 횟수
숫자가 높을 수록 장치의 지원이 좋다.
www.kernel.org 에서 최신 커널 확인을 할 수 있다.

모놀로딕( monolithic-kernel ) 커널 : 자주 사용하는 요소는 커널에 포함하고, 자주 사용하지 않는 요소( 스캐너, 등등 )는 모듈로 작성하여 필요시 하다 호출.

'Programming > Linux' 카테고리의 다른 글

파일의 링크  (0) 2009.10.08
기본 명령어  (0) 2009.10.08
[Kernel 2.6]프로세스 스케쥴링  (0) 2009.09.22
명령어( 폴더, 파일 관련 )  (0) 2009.09.19
디버깅  (0) 2009.09.19

설정

트랙백

댓글

MySQL 사용

Programming/Database 2009. 9. 30. 19:24
MySQL 에 접속을 성공 적으로 했다면, 먼저 Database 를 만들거나, 이미 만들어져 있으면 이를 선택하여 table을 만들거나 보거나, 수정 등등을 할수 있다.

show databases;
데이터베이스를 보여준다.

use DatabaseName;
데이터 베이스를 선택한다.

show tables;
테이블을 보여준다

'Programming > Database' 카테고리의 다른 글

MySql 연결  (0) 2009.09.30
Mysql 설치 및 설정  (0) 2009.09.16

설정

트랙백

댓글

MySql 연결

Programming/Database 2009. 9. 30. 19:16
mysql 연결은 콘솔로 하거나 아니면 yogsql 같은 GUI로 된 프로그램으로 접속 할 수 있다.
GUI로 된 프로그램은 그냥 설치해서 비번이나 포트 아이피 주소만 넣어주면 되므로 생략하고, 콘솔로 접속하는 법을 알아보겠다.
먼저, Mysql 이 설치된 폴더로 이동하여, MySQL Server 5.1\bin 에 이동하면 mysql.exe 가 있다.
"mysql -h 아이피주소 -u 아이디 -p비번" 을 입력하면 된다.

예 ) mysql -h localhost -u root -p1234 입력을 하면 mysql> 이라고 프롬프트가 뜰것이다.

'Programming > Database' 카테고리의 다른 글

MySQL 사용  (0) 2009.09.30
Mysql 설치 및 설정  (0) 2009.09.16

설정

트랙백

댓글

연산자 오버로딩

Programming/C++ Language 2009. 9. 30. 18:29
연산자 오버로딩을 할 때는, 연산자 오버로딩 함수가 멤버함수 나 비멤버 함수가 될 수 있다.
멤버 함수 라면, 가장 왼쪽의 피연산자( 혹은 하나뿐인 ) 가 반드시 연산자 클래스의 객체( 또는 개체의 참조 ) 가 되어야 한다.
비멤버 함수 일 경우에는, 왼쪽의 피연산자가 반드시 내장 타입이거나 다른 클래스의 객체가 되어야 한다. 그러나 이 함수가 private 나 protected 멤버에 직접 접근한다면 비멤버함수는 friend 함수로 구현 되어야 한다. 비멤버 함수를 사용하는 다른 이유는, long int 타입과 huge integer 타입 클래스를 더한 다고 했을 때, 이 때 사용할 임시 huge integer 객체를 생성한다. 이 처럼 덧셈 연산자의 피연산항을 교환할 수 있도록 만들 필요가 있다.
get , set 함수가 클래스의 public 인터페이스에 있다면, 비멤버 함수가 반드시 friend가 될 필요는 없다.( 대신, 함수 호출에 따른 부하가 있다 )

const test operator + ( const test& ) const;

const test : 리턴 타입
opertor + : 함수이름
const test& : 인수 = 피연산자
const : 상수 함수


ex 1 ) <<, >> 연산자 오버로딩
class PhoneNumber {
friend ostream &operator<<( ostream&, const PhoneNumber &);
friend istream &operator>>( istream&, PhoneNumber & );
}

cin >> phone;
cout << phone << endl;

연산자 오버로딩 정의 및 구현시에 문법은 위와 같다. cin >> phone; 를 컴파일러는 operator >> ( cin, phone ); 와 같은 비멤버 함수 호출을 생성한다. 반환값을 ostream&, istream&로 하는 이유는, 두번째 cout 구문을 보면, 먼저 operator <<( cout, phone ) 을 호출하고 난 뒤에, ostream 이 반환되서 다시 operator << ( cout, endl ) 이 호출되어 << 와 >> 을 연속적으로 사용 가능 하게 해준다.


ex 2 ) 단항 연산자 오버로딩
class String {
friend bool operator!( const String & );
}

class String {
public:
    bool operator! () const;
}

( s 는 String 객체 )
멤버 함수가 선언 되어 있을 때는, !s 는 s.operator!(); 호출이 된다.
friend 함수로 선언 되어 있을 때, !s 는 operator!(s) 가 된다.


ex 3 ) 이항 연산자 오버로딩

이항 연산자 오버로딩은 1. 하나의 인수를 갖고, static이 아닌 멤버함수 2. 두 개의 인수( 단, 하나는 반드시 클래스 객체 or 클래스 객체의 참조 )를 갖는 비멤버 함수로 오버로딩 될 수 있다.

1 번 의 경우
public String {
public:
     const String &operator+=( const String & );
}

y += z 는 y.operator( z ) 가 된다.

2 번의 경우
class String {
     friend const String &operator+=( String &, const String & );
}

y += z 는 operator+=( y, z ) 가 된다.


ex )
const Array& Array::operator=( const Array& right )
{
   return *this; // x = y = z; 반복적인 호출 가능하도록
}

int& Array::operator[]( int subscript )
const int& Array::operator[]( int subscript ) const

여기서 위의 [] 연산자는 참조를 반환해서 lvalue 를 생성 하는 것이고,
아래의 [] 연산자는 상수 참조 반환으로 rvalue 를 생성한다. 여기서 주목 할 것은 붉은색 const 이다.
이는 상수 함수를 뜻하는 것으로, 단일 연산자일 경우 a[1] 라고 코딩 했을때 이는 a.operator[]( 1 ) 이 될 것인데 여기서 a 는 상수 이기 때문에 상수 함수로 취할 필요가 있다. 물론 이항 연산자일 경우에는 필요 없을 것이다.

'Programming > C++ Language' 카테고리의 다른 글

static 클래스 멤버  (0) 2010.03.19
namespace  (0) 2010.03.19
순수 가상 함수  (0) 2009.09.26
가상 함수의 활용  (0) 2009.09.25
가상 함수에 대한 이해  (0) 2009.09.25

설정

트랙백

댓글

구조체 정렬

Programming/C Language 2009. 9. 27. 15:03
구조체는 구조체 내에 있는 변수 크기에 의해 정렬이 된다.


이는 프로젝트 옵션에서 설정해 줄수도 있다. VS8에서의 모습이다. 프로젝트 속성에 들어가면 "C/C++ -> Code Generation -> Struct Member Alignment " 에서 설정해 줄수 있다. Default 를 주게되면, 앞서 말한대로 구조체 멤버크기에 맞춰서 하게 된다. 컴파일러 에서는 옵션에서 설정 된 값과, 구조체 멤버 크기 중에 작은 쪽에 맞추어 정렬을 한다.

구조체 정렬 기능에 의해 멤버들이 구조체 내의 어느 오프셋에 배치될지는 미리 예측하기 어렵다. 설사 계산 가능하다 하더라도 옵션을 바꾸면 오프셋이 다시 바뀔 수 있으므로 암산으로 계산한 오프셋을 사용하는 것은 바람직하지 않다. 만약 특정 멤버가 배치된 오프셋을 조사하고 싶다면 stddef.h에 다음과 같이 정의되어 있는 offsetof 매크로 함수를 사용한다. 

#define offsetof(s,m)   (size_t)&(((s *)0)->m) 

첫 번째 인수로 구조체, 두 번째 인수로 멤버의 이름을 주면 이 멤버가 실제로 배치된 오프셋을 리턴한다.

#include <Turboc.h>
#include <stddef.h>

void main()
{
     struct Node { 
          int a; 
          double b; 
          char c[16]; 
          Node *prev; 
          Node *next; 
     };

     Node A, B;
 
    printf("a의 오프셋 = %d\n",offsetof(Node,a));
    printf("b의 오프셋 = %d\n",offsetof(Node,b));
    printf("c의 오프셋 = %d\n",offsetof(Node,c));
    printf("prev의 오프셋 = %d\n",offsetof(Node,prev));
    printf("next의 오프셋 = %d\n",offsetof(Node,next));
}

실행 결과는 다음과 같다. 

a의 오프셋 = 0
b의 오프셋 = 8
c의 오프셋 = 16
prev의 오프셋 = 32
next의 오프셋 = 36

만약 구조체 전체가 아니라 특정 멤버 앞쪽의 멤버만 복사하고 싶다면 이 멤버의 오프셋을 알아야 하는데 이때 offsetof 매크로가 유용하게 사용된다. 예를 들어 A 구조체의 링크 정보는 빼고 실제 데이터만 B로 복사하고 싶다면 memcpy(&B,&A,offsetof(Node,prev)); 하면 된다.

출처 : www.winapi.co.kr

'Programming > C Language' 카테고리의 다른 글

new int(3) 과 new int[3]  (0) 2010.05.27
#if  (0) 2010.05.27
#include 와 #define 의 순서  (0) 2009.08.18
매크로 함수  (0) 2009.08.18
코딩 스타일  (0) 2009.08.15

설정

트랙백

댓글

Editbox 설정

Programming/Windows Programming 2009. 9. 26. 23:51
Editbox 에 text를 여러 줄에 출력되도록 하려면 설정을 해줘야된다.

Multiline 속성 : TRUE - Editbox 에 여러 줄이 출력 가능하다.
Want Return 속성 : TRUE - Editbox 에서 엔터를 칠 경우 다음 줄로 내려간다.
Auto HScroll 속성 : FALSE - Editbox 에 출력을 하거나 키보드로 입력을 할 때, 가로 방향으로 입력이 창 크기가 넘을 경우, 자동으로 아래줄에 글씨가 써진다. 횡축으로 스크롤이 자동으로 되는 것을 막았기 때문에 아래로 자연스레 커서가 내려오는 것이다.

Auto VScroll 속성은 바꿔도 똑같은거 같은데 ... 뭐하는지 모르겠다... -0- 뭐에 쓰는 옵션일꼬...

'Programming > Windows Programming' 카테고리의 다른 글

컨트롤 변수 사용( Value )  (0) 2009.09.22
라디오 버튼 그룹지정 하기  (0) 2009.08.22
IP HELP API 설정하기  (0) 2009.08.22
[MFC] 더블 버퍼링  (0) 2009.06.22
[MFC] Bitmap Object  (0) 2009.06.07

설정

트랙백

댓글

순수 가상 함수

Programming/C++ Language 2009. 9. 26. 00:12
순수 가상 함수 는 자바의 Interface와 같은 것이다. 문법은 간단히 =0 만 붙여 주면된다. virtual void Draw()=0; 여기서 함수의 동작을 구현해주고 싶으면 헤더파일에서 virtual voidi Draw()=0{ test(); } 로 구현을 해주면 된다. 이 때, 동작은 Interface를 상속받아 재정의를 한 Draw를 호출할 경우, 항상 먼저, Interface에 구현 되어 있는 test() 를 먼저 호출하고 난 뒤에 재정의된 Draw() 함수 코드가 수행 된다는 것이다.
그리고 순수 가상 함수를 포함하는 클래스는 추상 클래스 이므로 인스턴스를 생성 할 수 없다. 단, 포인터형 변수는 선언 할 수 있다.

'Programming > C++ Language' 카테고리의 다른 글

namespace  (0) 2010.03.19
연산자 오버로딩  (0) 2009.09.30
가상 함수의 활용  (0) 2009.09.25
가상 함수에 대한 이해  (0) 2009.09.25
Static Member  (0) 2009.05.31

설정

트랙백

댓글

가상 함수의 활용

Programming/C++ Language 2009. 9. 25. 23:29
활용 1.

class Rectangle

{
public:
virtual void Show() { ~ };
virtual void Hide() { ~ };
void Move() { Hide(); ~ ; Show(); };
}

class Circle : public Rectangle
{
public:
virtual void Show() { ~ };
virtual void Hide() { ~ };
}

void main()
{
Rectangle R;
Circle C;

R.Move();
C.Move();
}

이 때 결과는 어떻게 될까?
R 은 자신의 move 함수를 C 객체는 부모의 move 함수를 호출 하지만, move 내에 있는 Show와 Hide는 각자 자신의 Show와 Hide 함수를 호출한다. 왜 그럴까?
이유는 간단하다. 묵시적으로 this-> 가 함수앞에 생략 되어 있기 때문이다. this->Show(); this->Move() 같이 말이다. 그래서 R에서 Move를 호출할 때는 Rectangle 클래스에 있는 Show, Hide 함수가 호출 되고, C에서 Move를 호출 할 때는 Circle 클래스에 있는 Show, Hide 함수가 호출 된다.


활용 2.

장기적인 관점에 봤을 때, 재활용성이 높은 클래스를 만들 필요가 있다. 이를 위해서, 파생 클래스에서 재정의 할 수 있도록, 재정의할 함수는 가상 함수로 사용하도록 하자. 가령, Student Management 라는 클래스가 있고, 여기에 Add, Remove, Edit, Dump 라는 함수 가 있을 때, Dump 하는 방법을 다르게 구현 할 필요가 있을 수 있다. 그럴 때는 Student MAnagemnt 클래스를 상속 받아서, Dump를 virtual 로 재 정의 하여, 원하는 방식대로 dump 를 할 수 있다. 즉, 재활용 높은 클래스를 만들고자 할 경우, 앞으로 재정의 할 가능성이 있는 함수를 구현 할 때는 virtual 을 선언하여, 재정의 가능 하도록 구현을 하자.


활용 3.

가상 소멸자를 사용 할 필요가 있다. Parent 클래스, Child 클래스가 있을 경우 Child 는 Parent를 상속하는 클래스라고 하자. 이때, Parent 와 Child 의 생성자에서 자원을 할당 하고, 이를 소멸자에서 자원을 해제한다고 할 때, Parent 포인터를 사용하지 않는다면, 정상적으로 생성자 소멸자가 동작하여, 자원을 정상적으로 생성, 해제 할 수 있다. 하지만 Parent* pParent 를 사용하여 Child를 대입 했을 경우, Delete pParent 를 할 경우, 부모의 소멸자만 동작을 하게되고, Chlid 의 자원을 해제 못하게 되어 누수가 될 것이다. 이 때, 소멸자를 virtual 로 선언을 하게 되면, Child 의 소멸자가 호출되고, Parent의 소멸자가 호출되어 자원이 정상적으로 해제 될 것이다.

'Programming > C++ Language' 카테고리의 다른 글

namespace  (0) 2010.03.19
연산자 오버로딩  (0) 2009.09.30
순수 가상 함수  (0) 2009.09.26
가상 함수에 대한 이해  (0) 2009.09.25
Static Member  (0) 2009.05.31

설정

트랙백

댓글