본문 바로가기

Academy I/Tech Academy

Unix System Programming 3

Unix System Programming 3  - :NAMESPACE PREFIX = ST1 />김성호(moohou) :NAMESPACE PREFIX = O />

_________________________________________________________________________

 

3. 문맥상의 화일

 

3.1. 다중 사용자 환경에서의 화일


3.1.1. 사용자와 소유권

UNIX 시스템의 모든 화일은 시스템의 사용자 중 하나에 의해 소유된다. 이 사용자는 보통 화일을 생성한 사용자이다.

 

유효그룹 식별번호와 유효사용자 식별번호 실제로 프로세스를 수행시킨 사용자의 사용자 식별번호는 그 프로세스의 실사용자 식별번호(real user-id)라고  부르고, 실제 생성된 화일에 대한 소유권을 갖는 사용자의 사용자 식별번호를  유효사용자 식별번호라고 부른다. 물론 대부분의 경우, 유효사용자 식별번호와 실사용자 식별번호는 동일하다.

 

3.1.2. 허가와 화일모드

다른종류의 소유권과 같이 화일의 소유권은 소유자에게 어떤 권리를 준다. , 소유자는 화일에 관련된 허가(permission)를 선택할 수 있다.

 

 다음과 같은 사용자의 세가지 유형이 허가에 의해 영향을 받을 수 있다.

 

 1. 화일의 소유자

 2. 화일의 소유자와 같은 그룹에 속하는 사용자

 3. 1 2 의 범주에 속하지 않는 사용자

 

사용자의 각 범주에 대해, 화일허가의 세가지 기본적인 유형이 있다.

 

 1. 화일의 읽기

 2. 화일에 쓰기

 3. 화일의 수행(화일이 프로그램 또는 쉘 명령어 리스트를 가지고 있는 경우)

 

 화일 허가를 정하기 위한 팔진수 값

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

  팔진수 값          의 미

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

  0400  소유자에게 읽기를 허가함

  0200  소유자에게 쓰기를 허가함

  0100  소유자에게 화일의 수행을 허가함

 

  0040  그룹에 대해 읽기를 허가함

  0020  그룹에 대해 쓰기를 허가함

  0100  그룹에 대해 화일의 수행을 허가함

 

  0004  다른 모든 사용자에 대해 읽기를 허가함

  0002  다른 모든 사용자에 대해 쓰기를 허가함

  0001  다른 모든 사용자에 대해 화일의 수행을 허가함

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

 

3.1.4. open creat

화일의 초기 허가는 creat 또는 open 호출을 통해서 화일이 생성된다.

 

  filedes = creat("datafile",0644);

 

3.1.5. access 호출로 화일 접근 가능성 판별

시스템 호출  access 는 유효사용자 식별번호가 아니라 실사용자 식별번호에 준하여 프로세스가 화일에  접근할 수 있는가를 알 수 있게 하는 유용한 수단이다.

 

 int result, amode;

 char *pathname;

 .

 .

 result = access(pathname, amode);

 

access 는 화일에 대한 접근 유형을 시스템에 알려준다. 인수의 값은 원래의 화일 모드와 유사한 다음의 팔진수 값으로 나타낸다.

 

 04  호출 프로세스가 읽기 접근이 가능한가?

 02  호출 프로세스가 쓰기 접근이 가능한가?

 01  호출 프로세스가 화일을 수행시킬 수 있는가?

 

3.1.6. chmod 로 화일 허가 변경

 int retval, newmode;

 char *pathname;

 .

 .

 retval = chmod(pathname, newmode);

 

chmod 시스템 호출은 존재하는 화일의 허가를 변경하기 위해 사용된다.  이것은 단지 화일의 소유자나 수퍼사용자만이 이용할 수 있다.

 

3.1.7. chown 으로 소유권 변경

chown 은 화일의 소유자와 그룹을 함께 변경하기 위해 사용된다.

 

 int retval, owner_id, group_id;

 char *pathname;

 .

 .

 retval = chown(pathname, owner_id, group_id);

 

3.1.8. 화일생성 마스크와 umask 시스템 호출

각 프로세스와 관련하여 화일생성(file creation mask)라는 정수값이 존재한. 이것은 화일이 생성될때 또는 creat 또는 open 호출로 화일모드가 주어질때마다 자동적으로 허가비트를 모두 0 으로 만들어 주기 위해 사용된다. 이것은 특정한 허가가 우연히 지정되는 것을 방지해 주기 때문에 생성된 화일의 안전을 위해서 유용하다.


기본 생각은 다음과 같다 :

만일 한  허가비트가 화일 생성 마스크에서 지정되면, 화일이 생성될때 그  허가비트를 항상 0 으로 만들어준다.


다음과 같은 문장

 

  filedes = creat(pathname, mode);

 

는 실제적으로 다음 문장과 동일하다.

 

  filedes = creat(pathname, (~mask)&mode);

 

여기서 mask 는 화일 생성 마스크의 현재값을 가지고, ~ C 의 비트단위 부(bitwise negative) 명령어이고, & 는 비트단위 AND 명령어이다.

 

3.2. 다중이름으로 된 화일

UNIX 화일은 하나 이상의 이름으로 식별될 수 있다. 다른 말로 한 화일은 복하여 메모리에 저장될 필요없이 여러 UNIX 경로이름과 관련될 수 있다. 그러한 각 이름은 링크(link)라고 불린다. 한 화일과 관련된 링크의 수는 그 화일의 링크 계수(link counter)라고 불린다.


새 링크는 link 시스템 호출로 생성된다. 그리고 존재하는 링크는 unlink 시스템 호출로 제거될 수 있다.

 

3.2.1. 시스템 호출 link


 int retval;

 char *path1, *path2;

 .

 .

 retval = link(path1, path2);

 

path1 UNIX  경로이름을 가리키는 문자형 포인터이다. 그것은 화일의 존재하는 링크, 즉 존재하는 이름을 지정해야 한다. path2는 화일에 대한 새로운 이름 또는 링크를 가리킨다.

 

3.2.2. 시스템 호출 unlink

시스템으로 부터 화일을 제거하는 간단한 방법으로 unlink 시스템 호출을 개한다.

 

  unlink("/tmp/scratch");

 

/tmp/scratch 를 제거한다. 사실, unlink 호출은 단지 한 링크를 제거하, 화일의 링크 계수를 하나 줄인다. 링크 계수가 0 이 되고, 현재 그 화일을 개방하고 있는 프로그램이 없게 되면, 화일은 시스템으로 부터 제거된다.

 

3.3. 화일정보획득 : stat fstat

두 시스템 호출 stat fstat 프로그램이 존재하는 화일의 특성을 알 수 있도록 하여 준다.

 

 #include <sys/types.h>

 #include <sys/stat.h>

 

 int retval, filedes;

 char *pathname;

 struct stat buf;

 .

 .

 retval = stat(pathname, &buf);

 

 retval = fstat(filedes, &buf);

 

pathname 은 화일을 식별하는 경로이름을 가리키고, &buf stat 구조를 가리키는 포인터이다.


stat 구조는 화일에 관련된 정보를 가지고 있다.

 

  struct stat {

          dev_t     st_dev;

          ino_t      st_ino;

          ushort    st_mode;

          short      st_nlink;

          ushort    st_uid;

          ushort    st_gid;

          dev_t     st_rdev;

          off_t       st_size;

          time_t    st_atime;

          time_t    st_mtime;

          time_t    st_ctime;

  };

 

stat 구조의 각각에 대한 의미는 다음과 같다.

 

1. st_dev 는 화일이 들어있는 논리적 장치(logical device)를 기술하고, st_ino 는 화일의 inode 번호를 나타낸다.


2. st_mode 는 화일모드를 부여하고, 프로그래머가 화일에 관련된 허가를 계산할 수 있도록 하여준다. st_mode 에 들어있는 값은 화일의 유형에 대한 정보로서, 허가에 관련된 것은 하위 12 비트이다.


3. st_nlink 는 화일에 관련된 링크의 수(다른말로, 서로 다른 경로이름의 )를 부여한다. 이 값은 link unlink 호출시마다 갱신된다.


4. st_uid, st_gid 이 두 구조는 각각 화일의 사용자 식별번호와 그룹 식별번호를 나타낸다. 초기치는 creat open 호출로서 지정되고, chown 호출로서 변경될 수 있다.


5. st_rdev 는 화일 엔트리가 장치를 기술하는데 사용될 때만 의미를 가진다.


6. st_size 는 화일의 현재 논리적 크기로서 바이트수를 부여한다. 이것은 화일의 끝에 쓰기명령이 있을 때마다 변경된다.


7. st_atime 는 화일의 자료가 마지막으로 읽혔던 시간을 기록한다. 초기치로 creat 호출시의 시간이 지정된다.


8. st_mtime 는 화일의 자료가 변경될 때의 시간을 기록한다. 화일에 쓰기 명령이 있을 때마다 변경된다.


9. st_ctime stat 구조 자체가 변경될 때의 시간을 기록한다. 이것을 변경하는 시스템 호출은 link(st_nlink 때문에), chmod(st_mode 때문에), write(st_mtime st_size 때문에) 등이 있다.

 

3.3.1. chmod 의 재고

chmod stat fstat 에 의해서 더 유용하게 사용될 수 있다. 왜냐하면, 이제 화일의 모드를 알 수 있으므로 프로그램이 화일허가를 무조건 다시 지정하지 않아도 되기 때문이다.


'Academy I > Tech Academy' 카테고리의 다른 글

Unix System Programming 7  (0) 2014.12.16
Unix System Programming 6  (0) 2014.12.16
Unix System Programming 5  (0) 2014.12.16
Unix System Programming 4  (0) 2014.12.16
Unix System Programming 2  (0) 2014.12.16
Unix System Programming 1  (0) 2014.12.16
Domain Driven Design - Modeling  (0) 2014.12.15
SQL로 하둡 쿼리를 처리하는 방법 10가지  (0) 2014.12.11