최근 수정 시각 : 2023-05-14 22:08:20

파일(UNIX)

1. 개요2. 특징3. 파이프
3.1. 방향변경
4. 파일 제어 함수
4.1. 저수준 파일 제어4.2. 고수준 파일 함수4.3. 소켓 함수
5. 기타

1. 개요

파일은 UNIX 또는 그와 호환되는 시스템에서 사용하는 입출력 방식이다. 동시에 데이터를 저장하는 형식을 말한다.

2. 특징

파일은 바이트의 나열이다. 이것을 어떻게 해석할지는 프로그램이 결정할 일이다. 단순히 텍스트 파일로 취급할 수 있지만 그것을 프로그램으로 실행하더라도 문제가 되지 않는다. 입출력과 운영체제에 연결된 장치도 파일로 취급되며 운영체제의 입출력 방식을 하나로 통일하는 역할을 한다.

유닉스에서 프로그램이 실행되면 3개의 파일이 자동으로 연결되며 표준[1] 입력(stdin)은 키보드, 표준 출력(stdout)과 표준 에러(stderr)는 터미널로 연결된다.

3. 파이프

프로그램이 터미널에 출력을 내보내는 대신에 다른 프로그램의 입력으로 사용할 수 있다. 표준 출력만 가능하며 기본적으로 표준 에러는 연결되지 않고 터미널에 바로 출력된다.

파이프는 한가지 목적을 수행하는 프로그램 다수를 연결시킬 수 있다. 다음은 셸에서 특수한 목적으로 사용되는 심볼이다. 내부적으로 처리되기 때문에 프로그램에 문자가 실제로 전달되지는 않는다.
  • | : 이전 명령어의 실행 결과를 다음 명령어로 전달된다.
  • && : 이전 명령어가 정상적으로 실행되었을때만 결과를 다음 명령어로 전달한다. 예를 들어 업데이트를 정상적으로 받아왔을때만 시스템 업그레이드를 수행하도록 지시할 수 있다.
파일:상세 내용 아이콘.svg   자세한 내용은 파이프(UNIX) 문서
번 문단을
부분을
참고하십시오.

3.1. 방향변경

표준 입력이나 출력을 실제 저장장치의 파일로 연결시킬 수 있다.
  • < : 저장소에 위치한 파일의 내용을 셸에 연결한다.
  • \> : 프로그램의 실행 결과를 저장소의 파일에 저장한다. 만약 두번 이상 기록했다면 마지막 실행 결과를 제외한 모든 내용이 소실된다.
  • \>> : 위와 비슷한 작업을 하지만 원본의 내용이 소실되지 않고 뒤쪽으로 덧붙혀진다.

이 심볼들은 여러개의 파일을 대상으로 할 수 없다. 만약 여러 파일의 내용을 출력해야 한다면 CAT 명령어를 사용할 수 있다.

4. 파일 제어 함수

4.1. 저수준 파일 제어

open, close, creat, read, write등, 유닉스 계통 운영체체에서 제공하는 시스템 호출중의 한 종류이다. 파일의 생성과 삭제, 수정과 읽기 및 쓰기등의 기초적인 파일 관리 기능들을 제공한다. 보통 파일의 경로나 이름을 이용하여 작업하지만 프로그램에서 파일을 새로 생성하거나 수정할때는 파일 기술자라고 불리는 특수한 정수값을 이용한다. 0, 1, 2번은 표준 입출력을 위해 예약되어 있으며 3번부터 사용된다.

일반적인 상식과는 별개로 열린 파일이 반드시 디스크의 실제 파일과 연결될 필요는 없다. 용어가 충돌하기 때문인데 실제 디스크에 저장되는 데이터 집합은 파일으로, 프로그램에서 사용하는 데이터 집합은 스트림으로 구분해서 혼동을 방지하기도 한다. 그러나 이런 오해가 발생한 이유는 의도된 것인데 원래 유닉스는 단일, 통일성을 가지도록 설계되어 시스템 전체가 단 하나의 자료 구조만을 사용하기 때문이다. 그래서 프로그램에 파일의 내용과 스트림이 바뀌어서 전달되어도(원래는 스트림을 받지만 파일의 내용을 전달했을 경우) 동작에 문제가 생기는 일이 없다.
#!syntax cpp
int creat(char *name, int flag);
int rename(char *bname, char *aname);
int unlink(char *name);

int open(char *name, int flag);
int open(char *name, int flag, int mode);
int close(int fd);

ssize_t read(int fd, void *buf, size_t siz);
ssize_t write(int fd, void *buf, size_t siz);

4.2. 고수준 파일 함수

일반적으로 스트림이라고 불린다. 저수준 파일 함수들이 속도를 중요시했다면 이 함수들은 실용성에 중점을 두었다. 고수준 파일 함수들이 최종적으로 저수준 함수들을 호출하도록 설계되어 있지만 실제 동작은 래핑 수준과는 다소 차이가 있다. 세상에서 가장 흔한 프로그램인 printf 함수로 작성하는 헬로 월드 프로그램의 함수는 여기에 속한다.

4.3. 소켓 함수

유닉스는 네트워크 통신을 위한 스트림도 파일로 취급하기 때문에 일단 연결되면 고유의 파일 기술자를 갖는다. 그러나 저수준 파일 함수들을 사용하여 입출력은 불가능하고 통신 방식에 따라 send, recv와 sendto, recvfrom 등의 함수를 사용한다.

5. 기타

유닉스에서 제공하는 거의 대부분의 API는[2] 파일과 관련된 함수들이다. 또는 저수준 파일 함수를 래핑한 고수준 파일 함수를 래핑한 더 높은 수준의 파일 함수 또는 다른 실용적인 함수로 연결된다.


[1] standard input이니 직역하면 표준 입력이지만, '통일된 규격'이라는 의미가 강한 표준보다는 특별히 주어지지 않으면 사용되는 입력이라는 의미의 "기본입력"이 정확한 번역이라고 볼 수 있다.[2] 유닉스의 탄생, Brian W. Kernighan