File4developers

Ubuntu Korea Community Wiki
imported>Drake님의 2014년 6월 9일 (월) 12:19 판 (새 문서: * 여기서는 리눅스의 파일과 디렉토리를 살펴보고, 그 파일과 디렉토리를 방법에 대해 알아보겠다. 파일 만들기, 열기, 읽기, 쓰기, 그리고...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
둘러보기로 이동 검색으로 이동
  • 여기서는 리눅스의 파일과 디렉토리를 살펴보고, 그 파일과 디렉토리를 방법에 대해 알아보겠다. 파일 만들기, 열기, 읽기, 쓰기, 그리고 닫기에 대해 알려줄것이며, 예제를 통해 디렉토리를 생성하고 찾고 지우는 일련의 조작방법도 알아볼거다.근데 나도 잘 몰라
  • 리눅스 파일 IO 다루는 방법 알아보기 전에 파일, 디렉토리, 장치에 관련된 개념을 좀 알아볼거다. 파일과 디렉토리를 조작하기 Win32API같은 System Call을 사용할 필요가 있는데, 라이브러리 함수가 있다귀찮으신 분들이 다 만들어 두셨다 만세

Linux / Unix에서 파일의 구조

  • "왜 파일구조를 알아야 함? 나 윈도우에서도 파일 존나 열고 닫아봤어 다 안다고"일단 명치 존나 쎄게 한대만 맞고 시작하면 안될까? 일단 좀 다르다.이런 씨댕 다 알면 그냥 안 읽으면 되잖아
  • Linux에서는 일반적으로 어플리케이션들은 디스크 파일, 시리얼 포트, 프린터, 기타 디바이스까지 파일로 쓴다. 여기서 예외적인게 몇가지가 있긴 한데 일단 신경쓰지말고.. 가장 중요한게 열기, 닫기, 읽기, 쓰기, ioctl이다.
  • 디렉토리 역시 파일의 한 종류고, 존나 옛날 SCO Unix 초기버전 같은거에서는 슈퍼유저도 디렉토리를 못 지웠다고 한다. 우린 그냥 지우면 된다.요즘 리눅스는 가끔 윈도우보다 편할때도 있다니깐 아 물론 가끔임

디렉토리

  • 일단 윈도우에서는 폴더라는 이름으로 부른다.
  • 파일은 그 이름과 관리정보, 그러니까 언제 만들어졌는지, 권한은 뭐가 필요한지 같은 정보를 가지고 있다. 관리정보는 inode에 저장되고, inode는 파일의 크기와 디스크상에 물리적으로 저장된 위치정보를 담고있다. 시스템은 파일의 inode 번호를 사용한다.
  • 디렉토리는 inode와 다른 파일들의 명칭을 저장하고 있는 파일이다. (디렉토리 파일 자체를 볼 수 있는 방법을 아는 사람은 추가바람)
  • 파일은 디렉토리에 정렬되며 보조 디렉토리를 포함할 수도 있다. 이러한 형태는 CP/M 시절부터도 써오던거다. drake라는 사용자는 보통 그의 홈디렉토리 /home/drake에 전자메일, 업무용 문서, 만든 프로그램 등을 저장하는 보조 디렉토리가 있을거다. 리눅스는 현재 사용자의 홈 디렉토리를 ~로 표시하는 존나 훌륭한 표기법을 가지고 있다. 귀차니즘의 승리 다른 사용자의 홈 디렉토리는 ~user로 표기된다. 예를들어 disint라는 사용자의 디렉토리는 ~disint이다. 일반적으로 각 사용자의 홈 디렉토리는 /home의 하위 디렉토리다.
  • /home 디렉토리는 /라는 루트 디렉토리의 서브 디렉토리다. /bin에는 시스템 프로그램이 저장돼 있고, /etc에는 시스템 환경설정파일이, /lib에는 시스템 라이브러리가 모여있다. 물리적인 장치를 나타내는 파일과 이러한 장치에 대한 인터페이스를 제공하는 것들은 /dev, /proc, /sys 에 있다.

파일과 장치

  • 하드웨어 장치도 유닉스에서는 파일로 표현된다.
  • 예를 들어 /mnt/cdrom으로 CDROM을 그라운딩마운트하려면 다음과 같다.GUI를 쓰면 그냥 인식된다. 즉 뻘짓임

<source lang="bash"> $ mount -t iso9660 /dev/sdc /mnt/cdrom $ cd /mnt/cdrom

  • 위의 내용은, 일단 부팅될때 cdrom을 찾으면 어디라고 나온다. 그게 /dev/sdc이었던거다. 그걸 /mnt/cdrom에다가 마운트한다는 의미다.

/dev/console

  • 이 장치는 시스템 콘솔이다. 에러메세지나 시스템 및 운영체제의 메세지는 이쪽으로 표시가 된다. 일반적으로 tty1~8, 시리얼포트쪽으로 뽑아낼 수 있다. 커널 설정에서 바꿔줄 수 있는데, 이 방법에 대해서는 다른 문서를 참조. 아니면 간결히 설명해주실 분이 추가바람

/dev/tty

  • 특별한 파일 /dev/tty는 닉네임이다. 현재 제어가 가능한 터미널을 지칭한다.
  • /dev/console과 다른점은, /dev/console은 고정되어 있고, /dev/tty는 바뀔 수 있다는 것.

/dev/null

  • 의미없는 장치.가끔 잉여로운 생활이 필요할때도 있지
  • 이 장치로 보내지는 모든 출력(output)은 무시된다.꼰대처럼
  • 이걸 읽으면 파일의 끝문자인 EOF가 반환되는데, 이는 cp명령을 사용할때 빈파일로 사용될 수 있다.
  • 일반적으로 디버그용의 문자를 출력하고 디버그가 종료됐을 때, 그냥 출력을 이쪽으로 돌리는 것을 많이 볼 수 있다.

<source lang="bash"> $ echo do not want to see this > /dev/null $ cp /dev/null empty_file </source>

  • /dev안에 다른 장치들은 하드디스크나 플로피디스크, 통신 포트, 테이프 드라이브, CDROM, 사운드칩, 그리고 몇몇 시스템의 내부적 상태를 나타내는 장치들로 구성된다. 용량이 0인 파일을 생성하기 위해 null바이트의 원천으로 작동하는 /dev/zero라는 장치도 있다. 대부분은 루트권한이 필요하다. 일반 사용자가 하드디스크 저수준 입출력을 가능하게 한다면.. 헬게이트 오픈

시스템 호출과 장치 드라이버

  • 몇가지 함수로 파일과 장치를 컨트롤하거나 읽고 쓸 수 있다. 이런 함수를 시스템 콜이라고 부르며, 이것은 리눅스에 의해 직접 제공되고, 그 자체로 OS에 대한 인터페이스라고 볼 수 있다.
  • OS의 심장 커널은 많은 장치 드라이버를 갖고 있다. 이 드라이버는 시스템의 하드웨어를 제어할 수 있는 저수준 인터페이스 모음이다. 예를들어, 테이프 드라이브의 장치드라이버는 테이프 장치를 켜고 앞으로 감거나 뒤로 감거나 테이프에 직접 읽고 쓰는 방법이 있어야 테이프 장치를 쓸 수 있을거 아닌가. 또, 드라이버는 장치의 버퍼 등을 최대한 활용할 수 있게 만들어져 있다.
  • 하드디스크 드라이버 역시 사용자가 몰라도 되는, 섹터, 클러스터에 대한 접근을 할 수 있다. 랜덤억세스 역시 마찬가지. 변태가 아닌 일반 프로그래머가 '나 랜덤억세스로 할래'라고 하지 '랜덤억세스를 어떻게 하냐면..' 하고 프로그램을 짜진 않는다.
  • Read, Write가 아닌, 독특한 세팅은 ioctl() 함수를 이용해서 억세스하는게 일반적이다.
  • /dev/ 안의 디바이스파일도 그냥 일반 파일처럼 읽고 쓰는거다.
  • 장치 드라이버를 제어할 수 있는 저수준 함수에는 다음과 같은 것들이 있다.
  1. open - 파일 / 장치 열기
  2. read - 열린 파일 / 장치로부터 읽기
  3. write - 열린 파일 / 장치에 쓰기
  4. close - 파일 / 장치 닫기
  5. ioctl - 특별한 제어
  • ioctl이라는 시스템 호출은 필수적인 하드웨어 제어 기능을 제공한다. 시리얼포트같은 경우 read/write만 가능하면 어떻게 세팅을 하겠는가.존나 옛날에는 AT 어쩌구로 제어하긴 했었다 ATDT01410같이..
  • 시스템 콜이나 POSIX는 리눅스 맨페이지 2섹션에 있다.물론 영어 거기에 보면 시스템 콜에 대한 짤막한 설명이 있다.

라이브러리 함수