POSIX : OS가 App에게 제공하는 API들의 표준
System Call : 리눅스가 App 개발자들을 위해 제공하는 API
리눅스 App이 리눅스 커널에게 어떤 부탁을 하기위해 만들어진 API를 System Call이라고 함.
printf, scanf 또한, System Call로 만들어짐.
1) open( ) : fopen이 사용하는 syscall
2) read( ) : fscanf가 사용하는 syscall
3) write( ) : fprintf가 사용하는 syscall
4) close( ) : fclose가 사용하는 syscal
파일 디스크립터
int open(path, flag, mode)
아래와 같은 옵션이 존재
• O_RDONLY
• O_WRONLY
• O_RDWR
• O_CREAT : 없으면 새로 생성
• O_APPEND : 덧붙이기
• O_TRUNC : 파일 내용 제거 후 사용
int source_fd = open("source.txt", O_RDONLY);
// 소스 파일 열기
// 표준 출력 파일 디스크립터를 열린 파일로 재지정
int new_stdout = open("output.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
// S_IRUSR : 소유자에 대한 읽기 권한
//S_IWUSR : 소유자에 대한 쓰기 권한
close(fd)
파일디스크립터만 적는다.
file descriptor : OS가 임시적으로 특정 파일에 붙여준 정수형 값
open( ) API를 사용하면 커널에서 파일 구조체와 fd가 생성
open은 error가 찾기 때문에 Error 처리에 대한 로그메세지 남기자!
exit(0) : return 값 0, 정상종료
exit(1) : return 값 1, 오류로 인한 종료
FILE : 에러 file 이름
LINE : 에러 line 번호
#include <stdio.h>
#include <stdlib.h>
#define ERROR(msg) do { \
fprintf(stderr, "Error in %s at line %d: %s\n", __FILE__, __LINE__, msg); \
exit(EXIT_FAILURE); \
} while (0)
int main() {
FILE *file;
file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
ERROR("Failed to open file");
}
fclose(file);
return 0;
}
디버깅 및 오류 처리를 더 효과적으로 수행하는 데 도움이 됨.
read(fd, buf, 10);
// fd는 파일 디스크립터, buf는 읽은 데이터를 저장할 버퍼, 10은 읽을 최대 바이트 수
read(fd, buf, 10)를 호출 후 파일 오프셋이 이동하게 됨
off_t lseek(int fd, off_t offset, int whence);
• off_t : 정수 (long), 음수가능
• offset : 떨어져있는 곳
• whence : 기준
whence 기준
• SEEK_CUR : 현재위치 에서 부터
• SEEK_SET : 시작점 에서 부터
• SEEK_END : 끝 지점에서 부터