티스토리 뷰
창병모, 리눅스 프로그래밍 원리와 실제(생능출판, 2022)
5.1 시스템 호출
컴퓨터 시스템 구조
- 하드웨어는 CPU, 메모리, 저장장치, 주변장치 등으로 구성
- 운영체제는 하드웨어를 운영 관리하는 시스템 소프트웨어이며 유닉스/리눅스의 경우 커널(kernel)이 하드웨어를 운영 관리
운영체제 서비스
- 프로세스 관리
- 파일 관리
- 메모리 관리
- 통신 관리
- 주변장치 관리
시스템 호출
시스템 호출(system call) : 운영 체제가 제공하는 서비스에 대한 프로그래밍 인터페이스
- 시스템 호출은 커널에 서비스를 요청하기 위한 프로그래밍 인터페이스로 응용 프로그램은 시스템 호출을 통해서 커널에 서비스를 요청 가능
시스템 호출 구현
5.2 파일
파일 열기와 파일 디스크립터
- 파일 디스크립터는 열린 파일을 나타내는 번호
int open(const char *path, int oflag, [ mode_t mode]);
- path가 나타내는 파일을 연다
- 성공하면 파일 디스크립터 반환, 실패하면 -1 반환
- oflag 매개변수는 위의 입출력 모드 중 하나를 지정해 주어야 함
- open() 시스템 호출을 파일을 열고 열린 파일의 파일 디스크립터를 반환
- 세 번째 매개변수 mode는 새롭게 만드는 파일의 접근권한으로 새로운 파일을 만드는 경우(O_CREAT)에만 사용
파일 생성과 파일 닫기
int creat (const char *path, mode_t mode);
- path가 나타내는 파일을 생성하고 쓰기 전용으로 연다
- 파일 생성에 성공하면 파일 디스크립터를, 실패하면 -1 반환
- open() 시스템 호출과 동일
int close(int fd);
- fd가 나타내는 파일을 닫음
파일 읽기 read()
ssize_t read (int fd, void *buf, size_t nbytes);
- fd가 나타내는 파일에서 nbytes 만큼의 데이터를 읽어 buf에 저장
- 성공하면 읽은 바이트 수, 파일의 끝을 만나면 0, 실패하면 -1 반환
파일 쓰기 write()
ssize_t write(int fd, void *buf, size_t nbytes);
- buf에 있는 nbytes 만큼의 데이터를 fd가 나타내는 파일에 쓴다
- 성공하면 실제 쓰여진 데이터의 바이트 수를 반환, 실패하면 -1 반환
파일에 블록 쓰기
- write() 시스템에서 유의할 점은 이 시스템 호출을 이용해 어떤 데이터든지 파일에 저장할 수 있다는 것
- 두 번째 매개변수 buf는 어떤 타입의 데이터이든지 상관없이 데이터를 저장하고 있는 곳의 시작주소(포인터)를 받을 수 있음
- 세 번째 매개변수 nbytes는 그 데이터의 크기를 받음
int i;
write(fd, &i, dizeof(int));
struct student record;
write(fd, &record, sizeof(record));
- 정수형 변수에 저장된 값을 그대로 파일에 저장할 수 있고, 구조체 변수 저장도 가능
- 파일에 연속된 바이트 형태로 저장된 변수의 값을 어떻게 그대로 복원 가능?
➡ read() 시스템 호출을 이용해 파일에 저장된 데이터를 연속된 바이트 형태로 읽어서 원래 자료형 변수에 순서대로 저장하면 원래 데이터 그대로 복원 가능
int i;
read(fd, &i, sizeof(int));
struct student record;
read(fd, &record, sizeof(record));
파일 디스크립터 복제 dup()
int dup(int oldfd);
- oldfd에 대한 복제본인 새로운 파일 디스크립터를 생성하여 반환
- 실패하면 -1 반환
int dup2(int oldfd, int newfd);
- oldfd를 newfd에 복제하고 복제된 새로운 파일 디스크립터 반환
- 실패하면 -1 반환
5.3 임의 접근
임의 접근과 파일 위치 포인터
- 파일 위치 포인터는 파일 내에 읽거나 쓸 위치인 현재 파일 위치를 가리킴
임의 접근 lseek()
off_t lseek(int fd, off_t, offset, int whence);
- fd가 나타내는 파일의 현재 위치를 whence를 기준으로 offset만큼 이동시킴
- 성공하면 갱신된 현재 파일 위치 반환, 실패하면 -1
임의 접근을 이용한 레코드 수정
(1) 파일로부터 해당 레코드 읽기
(2) 레코드 수정
(3) 수정된 레코드 다시 파일 내의 원래 위치에 쓰기
- 레코드를 읽으면 현재 파일 위치가 자동으로 그 만큼 이동한다는 점에 주의
'❄️ Sookmyung > 💾 Linux' 카테고리의 다른 글
[Linux Programming] Chapter 7. 파일 및 레코드 잠금 (0) | 2022.04.25 |
---|---|
[Linux Programming] Chapter 6. 파일 시스템 (0) | 2022.04.25 |
[Linux Programming] Chapter 4. C 표준 파일 입출력 (0) | 2022.04.22 |
[Linux Programming] Chapter 3. C 프로그래밍 환경 (0) | 2022.04.21 |
[Linux Programming] Chapter 2. 리눅스 사용 (0) | 2022.04.21 |