본문 바로가기

공부공간/System programming

[시스템프로그래밍 강의정리] files and directories - 2

반응형

file, directory안에서 쓸 수 있는 명령어들을 배웠다.

 

명령어 모음 : 

access()

umask()

chmod()

chown()

link() 

unlink() 

readlink() 

remove() 

rename() 

 

위 명령어들에 대해서 간단히 설명하시오. 설명할 수 없으면 공부해야합니다.

 


 

 

 

명령어 모음 : 

access() : 해당 접근 권한이 있는지 확인

umask() : 해당 권한을 뺀다

chmod() : 접근 권한바꾸기

chown() : 파일에 대한 소유주를 바꾼다

link() : 하드링크, 소프트링크 연결에 대한 명령어

unlink() : 링크 제거 (file,dir 제거까지 가능)

readlink() : 링크의 path를 가져오는 명령어

remove() : 파일 제거

rename() : 파일 이름 새로짓기

 

access()

access는 R,W,X,F권한이 있는지 확인하는 함수이다.

 

함수 동작 : 

argv[1]는 이 함수에 넣을 프로그램 이름이다.

즉, argv[1]라는 프로그램이 R_OK권한이 있나를 확인. 다시말해 argv[1]로 넣을 인자의 프로그램이 읽기 권한이 있는지 확인해서 읽을 수 있으면 printf(read access OK), 없으면 err메세지 return

 

결과:

whoami : obama

a.out 이라는 파일에 대해서는 소유주 이지만

/etc/shadow 에 대해서는 other이다.

 

따라서 /etc/shadow파일에 대해서는 read권한이 없으므로 저런 메세지를 출력한다.

 

umask()

권한을 turnoff 한다.

umask(022) : group, other에 대해서 read권한을 뺀다.

 

따라서 tmp라는 파일을 권한을 666으로 만들었지만 umask로 인해 권한이 644로 하락

 

함수 사용 예시자료 : 

umask 동작

빨간색 umask보면

group의 r,w권한을 빼고, other의 read, write권한을 뺀것을 볼 수 있다.

아래 출력창에서 결과를 확인하자.

7

왼쪽 이름을 통해서 뜻을 대강 유추할 수 있다.

 

umask 사용 결과

 

"bar"가 위의 명령어로 인해 group, other의 권한중 read,write권한이 빠졌다.  execute권한은 애초부터 부여하지 않았다.

 

chmod()

change mode. 즉 권한을 바꾸는 명령어이다.

그런 명령어인 만큼 조건이 필요하다.

1) root권한이 있거나 ==> sudo

2) file 의 owner ID와 effective ID가 같아야 사용이 가능하다.

 

chmod, fchmod는 기능상 차이가 없다.

단지 fchmod는 열려있는 파일에 대해서 적용하는 명령어.

 

파란색 부분 : 현재 foo 파일의 권한에 대해서 상대적인 명령을 내린다.

권한 제어내용 : g -w, r+x

 

빨간색 부분 : 현재 bar 파일의 권한에 대해서 절대적인 명령을 내린다. 이전에 어떤 권한이 on 되어있건 상관없이 권한을 수정한다.

권한 제어 내용 : u+r+w, g+r, o+r

이전에 bar의 내용이 execute권한이 있다고 하더라도 무시되나??

 

chown()

권한의 대상을 바꾼다.

chmod와의 차이점:

chmod는 기존에 등록되어있던 user, group에 대해서 권한을 부여하거나 뺏거나 인데

chown은 기존에 등록되어있던 user, group을 바꾼다. 다른 사람으로 바꿔버리는 거야.

chown의 2,3번째 인자에 -1을 넣으면 그 대상에 대해서는 권한을 바꾸지 않는다는 말이다.

예를 들어 chown( xxx, -1 , abc) 하면 user는 그대로 두고 group은 abc로 바꾼다는 말.

 

chown 명령어 또한 권한을 제어하는 명령어인 만큼 조건이 필요하다.

root권한을 가진 관리자만이 제어가 가능하다.

 

link()

c++의 참조자 느낌.

기존의 파일에 대해서 접근하는 다른 경로를 만들어 주는 것이다. 

inode : 기존 file1의 속성을 담고 있다.

data block : file1의 data를 담고 있다.

inode는 file1의 속성도 가지고 동시에 file1의 data를 가리키는 포인터 역할도 하는 구조체이다.

 

그런 상태에서 file2를 link하면 file2가 바로 data block을 가리키는게 아니라 inode를 가리키게 된다.

 

또한 file1, file2가 있는 큰 박스는 directory를 의미한다.

link명령어를 수행하면 기존에 어떤 파일이 original파일이었는지 구분하지 못한다.

 

위의 그림과 같이 link를 걸어주는것을 hard link라고 한다.

hard link에 대해서는 제약사항이 몇가지 있다.

  1. 오직 root권한을 가진사람만 만들 수 있다.
  2. 같은 file system안에 있어야만 만들 수 있다.
unlink()

unlink()는 말그래도 link갯수를 하나 줄이는 것을 말한다.

만약 directory나 link가 1인 file을 unlink하면 삭제를 의미한다.

file system에서는 tree모양으로 dir, file을 관리하기 때문에 link제거하면 그 파일로 접근하는 주소를 잃어버리는것이고 결국 파일을 찾지 못한다. 즉 삭제를 의미한다.

 

symbolic link

hard link와 반대되는 것은 soft link인데 이는 symbolic link라고 부른다.

symbolic link는 hard link와는 대조적으로 제약사항에 대해서는 다음과 같다.

  1. 모든 사람에 대해서 만들수 있다.
  2. 같은 file system에 있지 않아도 된다.
  3. 심지어 존재하지 않는 파일에 대해서도 symbolic link를 만들 수 있다.

symbolic link는 포인터와 같다. 다음 그림을 보자

아래 그림은 symbolic link가 가리키는 대상 파일이 없어도 symbolic link를 만들 수 있거나 없어지지 않는다는 예시이다.

참고로 ls는 hard link, ls -s 는 symbolic link이다.

 

Example1 :

/no/such/file은 원래 없던 경로이다.

그 경로에 대해서 myfile이라는 symbolic link를 생성이 가능하다는 것을 볼 수 있다.

 

cat : 파일내용을 출력하라는 명령어이다.

 

 

Example2는

기존 파일에 대해서 ln-s를 생성하여 newfile->testfile이 된것을 볼 수 있다.

이 상태에서 newfile을 삭제해도 testfile은 지워지지 않는다.

 

remove

file에 대해서는 unlink와 같고

directory에 대해서는 rmdir와 같다.

 

rename

file, directory에 대해서 이름 다시 짓기. 필요하다면 dir 변경도 가능하다고 한다.

 

반응형