학교 강의를 복습하는 차원에서 작성하는 글입니다.
학부생 수준의 글이므로, 오류가 있을 수 있는 점 양해바람니다.
System Call, Standard Library Function
사용자가 작성한 프로그램이 Kernel이 제공하는 서비스를 사용
=> 함수 호출 -> Library 내부에서 SW interrupt 생성 -> Linux Kernel Interrupt Handler 호출 -> Linux Kernel 안에서 처리 -> Library에서 받아 함수로 전달
표준 라이브러리 함수
open
이미 존재하는 파일을 읽기 또는 쓰기용으로 열거나, 새로운 파일을 생성하여 연다.
close
open 으로 알려진 파일을 닫는다.
read
열려진 파일로부터 데이터를 읽어들인다.
write
열려진 파일에 데이터를 쓴다.
lseek
파일 안에서 읽기/쓰기 포인터를 지정한 바이트 위치로 이동한다.
unlink/remove
파일을 삭제 한다.
File의 개방 상태
파일 개방 상태
파일에서 읽거나 파일에 쓸 준비가 된 상태
파일 닫힘 상태
파일 엑세스가 끝나서 손대지 않는 상태 (리눅스 상에서 자동으로 닫아주지만, 습관적으로 닫는 습관 필요)
하나의 프로그램은 동시에 여러 개의 파일을 개방 가능
여러 개의 프로그램은 동시에 하나의 파일을 개방 가능
어떤 경우든 커널에 의해서 각 개방 상태가 유일하게 식별되어 관리된다.
FIle Descriptor 파일 기술자
실행중인 프로그램과 하나의 파일 사이에 연결된 개방 상태
음수가 아닌 정수형 값으로 시스템이 결정
프로그램 작성 시 실제 값이 무엇인지 알 필요 없음
파일 개방 실패하면 -1이 됨
커널에 의해서 관리됨
0/1/2는 특수 번호로 이미 있음
프로그램 안에서 열린 파일 한 개를 숫자로 지정해, 커널에 숫자를 통해 요청하면 해당하는 파일에 접근 가능
읽기 쓰기 포인터
개방된 파일 내에서 읽기 작업이나 쓰기 작업을 수행할 바이트 단위의 위치 (1 Byte = 8 bit = 1 char)
특정 위치를 기준으로 한 상대적인 위치 의미 (오프셋 offset)
파일을 개방한 직후에 읽기/쓰기 포인터는 0
파일의 첫번쨰 바이트를 가리키고. 파일의 내용을 읽거나 쓰면 그 만큼 증가한다.
파일 기술자마다 하나씩 존재.
서로 다른 프로그램이 동일한 파일을 개방해도 파일 기술자가 다르기 때문에 서로 다른 읽기쓰기 포인터를 가진다.
서로의 작업이 상대에게 영향을 주지 않고, 커널 안에 있다.
read/wirte 요청을 파일기술자와 함께 커널에 전달해, 커널은 내부에 보관된 파일 읽기/쓰기 포인터를 갱신한다.
읽기/쓰기 포인터 중 특정 위치
Offset 기준점
SEEK_SET => 파일의 첫 번째 바이트를 기준점으로
SEEK_CUR => 읽기/쓰기 포인터의 현재 위치를 기준점을
SEEK_END => 파일의 끝을 기준점으로(정확히는 파일 끝 다음이 0)
만약 파일 크기가 100 Byte고 읽기 쓰기 포인터가 현재 막 10번째 바이트를 읽었다면 읽기 쓰기 포인터는 11번째 바이트를 가리킨다.
12번째 바이트의 offset은
=> SEEK_SET = 11
=> SEEK_CUR = 1
=> SEEK_END = (12-1) - 100 = -89
Open 함수 / open system call
기존 파일을 개방하거나 새로운 파일을 생성한 후에 개방한다.
#include <fcntl.h>
int open(const char * pathname, int flags, [mode_t mode]);
# 중괄호는 생략 가능 의미
path name
개방할 파일의 경로 이름을 가지고 있는 문자열의 포인터이다.
flags
파일의 개방 방식을 지정한다.
mode
대부분의 경우 생략할 수 있는 값으로 새롭게 생성하는 파일의 초기 접근 권한을 지정
반환값
정상적으로 파일을 개방하면 파일 기술자 반환, 실패할 경우 -1을 반환
=> 이미 존재하는 파일 개방시 반드시 open 사용. 새로운 파일 생성시 open 이나 creat를 사용
path name
개방하려는 파일의 경로 이름
상대 경로 / 절대 경로
문자열 상수, 문자열 형의 포인터
filedes = open("/home/data.txt", O_RDONLY);
flags
파일을 개방하고 난 후의 접근 방식 (읽기 전용, 쓰기 전용, 읽기 쓰기 용)
|로 조합 가능
O_RDONLY
읽기만 가능한 상태로 접근
O_WRONLY
쓰기만 가능한 상태로 접근
O_RDWR
읽기, 쓰기 모두 가능한 상태로 접근(주로 사용)
O_CREAT
파일이 없으면 생성
O_APPEND
파일 읽기/쓰기 포인터를 파일의 끝에 보냄
O_EXCL
있는 파일을 덮어 씌우는 것을 예방
O_CREAT와 같이 사용
O_TRUNC
파일 읽기/쓰기 포인터를 파일의 처음으로 보냄
O_NONBLOCK
파일을 NON-Blocking 모드로 열기 => 파일 동작이 안 끝나더라도 Return 반환한다.
O_SYNC
파일 쓰기가 완료 될 떄까지 기다림 => 속도는 느리지만 안전하게 디스크에서 쓰기가 완료되고 끝난다.
mode
파일의 접근 권한을 의미한다.
이미 존재하는 파일을 개방하여 사용할 경우 생략하고
새로운 파일을 생성할 때 적용한다.
chmod 에서 옵션으롲 ㅜ는 세자리 숫자와 동일하다.
0777 -> rwx rwx rwx ==> C에서 숫자앞에 0을 붙이면 8진수 의미
open 으로 새로운 파일 생성하기
'O_CREAT' flag
open으로 새로운 파일을 생성할 때 사용
filedes = open("/tmp/tmpfile.txt", O_RDWR | O_CREAT, 0644);
O_RDWR => 새롭게 생성된 파일은 읽기와 쓰기가 가능
O_CREAT => /tmp/tmpfile.txt 존재하지 않는 경우 새롭게 생성, 새로운 파일을 생성할 때 반드시 사용
0644 => 새롭게 생성된 파일의 접근 권환 644 rw-r--r--
Ex)
#include <stdlib.h>
#include <fcntl.h>
int main(void)
{
int filedes; #오픈 할때마다 받을 수 있는 변수 선언 필요
char pathname[] = "temp.txt";
filedes = open(pathname, O_CREAT | O_RDWR, 0644);
if(filedes == -1)
{
printf("file open error!\n");
exit(-1);
}
close(filedes);
}
O_EXCL 플래그
이마 존재하는 파일을 O_CREAT 플래그 이용 개방할 때, 파일 오픈을 막아준다.
반환 값
호출이 성공하면 음이 아닌 정수형의 값 반환(파일 기술자)
프로그램 내에서 파일 기술자는 중복되지 않음
0,1,2는 반환값으로 나타나지 않는다.
반환 값이 -1이면 파일 개방에 실패(지정한 파일 존재하지 않거나 접근 권한이 없음)
open 호출 실패에 대한 대비
if(filedes == -1)
{
printf("file open error!\n");
exit(-1);
}
Close
open 이나 creat 의해 개방된 파일을 닫는다. (할당 받은 파일 기술자를 반환한다.)
개방된 파일을 사용이 끝나면 반드시 닫아주어야 한다.
=> 하나의 프로세스가 동시에 개방할 수 있는 파일의 수는 제한되어 있음
=> 시스템 차원에서 동시에 개방할 수 있는 파일의 수는 제한되어 있음
'프로그래밍 > Linux' 카테고리의 다른 글
[Linux]파일입출력(3) (0) | 2023.10.13 |
---|---|
[Linux]파일입출력(2) (0) | 2023.10.08 |
[Linux]파일시스템 (1) | 2023.10.08 |
[Linux]Debug (0) | 2023.10.08 |
[Linux]컴파일 make (0) | 2023.10.08 |