2022. 11. 9. 13:07ㆍ프로그래밍/시스템프로그래밍
헤더
<unistd.h> - Unix기반 컴파일러에 기본적으로 사용
<stdio.h> - 표준 입출력 (printf, scanf 등)
<stdlib.h> - 표준 라이브러리 (exit, size_t 등)
<sys/type.h> - type 선언 (ssize_t, time_t 등)
<sys/stat.h> - status 모드 비트 (S_IRUSR, S_IWUSR 등)
<fcntl.h>- file 제어 (O_RDONLY, O_RDWT, O_CREAT 등)
open()
prototype : int open (const char *pathname, int flags, mode_t mode);
리턴 값 : 파일 디스크립터(file descriptor) 값(int 타입) 또는 -1 (open()이 실패할 경우)
사용 예) open ( pathname, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); // create의 기능
플래그 (값, 8진수) | 설명 필수 플래그 |
O_RDONLY (00) | 읽기 전용으로 열기 |
O_WRONLY (01) | 쓰기 전용으로 열기 |
O_RDWR (02) | 읽기/쓰기용으로 열기 |
플래그 (값, 8진수) | 설명 선택적 플래그 |
O_APPEND (02000) | 파일의 끝에서부터 데이터를 추가하여 쓴다 |
O_TRUNC (01000) | 파일의 크기를 0으로 만든다(내용삭제) |
O_CREAT (0100) | 파일이 존재하지 않을 경우 생성한다 |
모드 매크로 | 의미 O_CREAT flag를 사용하여 파일 생성시, 다음의 매개인자를 사용한다 |
S_IRUSR | 소유자에게 읽기 권한 |
S_IWUSR | 소유자에게 쓰기 권한 |
S_IXUSR | 소유자에게 실행 권한 |
close()
prorotype : int close(int fd);
리턴 값 : 성공이면 0, 에러 발생시 -1을 반환
파일을 닫지 않더라도 프로세스가 종료하면 모든 열려진 파일들은 자동적으로 닫힌다
creat()
creat( pathname, mode );
open ( pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
위의 두 함수는 같은 기능을 한다. 문에 open을 주로 사용한다.
read()
파일에서 원하는 크기의 데이터를 읽는다
prorotype : ssize_t read (int fd, void *buf, size_t nbytes);
리턴 값 :
성공하면 읽은 byte 수
파일의 끝을 만나면 0 -> 읽기 종료
실패하면 -1
buf: 읽은 데이터를 저장할 메모리의 시작주소
nbytes: 읽을 바이트 수
사용 예) read(fd, buffer, BUFSIZE)
write()
prototype : ssize_t write (int fd, void *buf, size_t nbytes);
리턴 값:
성공하면 파일에 쓰여진 데이터의 바이트 수
실패하면 -1
buf : 쓸 데이터를 저장하고 있는 메모리 공간
nbytes : 쓸 데이터의 바이트 수
lseek()
파일에 대한 임의접근을 가능하게 한다.
prototype : off_t lseek (int fd, off_t offset, int whence );
offset : 편차값, whence : 기준점
매크로 이름 | 값 | 포인터 위치 지정방법 |
SEEK_SET | 0 | offset이 파일의 맨 앞에서부터 더해져 이동 |
SEEK_CUR | 1 | 현재위치에 offset이 더해져 이동 |
SEEK_END | 2 | 파일의 마지막 바이트 번호에 더해 이동 |
dup(), dup2()
사용 중인 fd의 복사본을 제공
Oldfd가 가리키는 사용자 파일 디스크립터 표의 구조체를 새로운 파일 디스크립터가 가리키도록 한다
리턴 값: 성공하면 복사된 새 파일 디스크립터, 실패하면 -1
dup() 함수는 할당 가능한 가장 작은 번호를 리턴한다
dup2() 함수는 newfd를 리턴한다
stat(), fstat(), lstat()
파일 상태에 대한 정보를 stat 구조에 가져온다
prototype :
int stat (const char *pathname, struct stat *buf );
int fstat (int fd, struct stat *buf );
int lstat (const char *pathname, struct stat *buf );
리턴값: 성공시 0, 실패시 -1
stat()가 경로명으로 파일을 지정하는 반면, fstat()는 파일 디스크립터를 지정한다
lstat()는 대상 파일이 심볼릭 링크(symbolic link)인 경우에 링크가 나타내는 파일이 아니라 링크 자신의 상태를 가져온다
struct stat {
mode_t st_mode; 파일 모드에 대한 정보
ino_t st_ino; 파일의 I-node 번호
dev_t st_dev; I-node가 있는 디바이스의 디바이스번호
dev_t st_rdev; 디바이스번호(디바이스 파일의 경우)
nlink_t st_nlink; 파일에 관련된 링크의 수
uid_t st_uid; 소유자의 사용자 ID
gid_t st_gid; 소유자의 그룹 ID
off_t st_size; 파일크기(바이트 수)
time_t st_atime; 최종 엑세스 시각
time_t st_mtime; 최종 변경 시각
time_t st_ctime; 최종 상태 변경 시각
blksize_t st_blksize; 파일 시스템의 블록 크기
blkcnt_t st_blocks; 할당된 블록수
};
사용 예)
struct stat st;
if(stat("test",&st) == -1){
perror("stat");
exit(1);
}
printf("Inode number : %ld\n", st.st_ino);
printf("create : %s",ctime(&st.st_ctime));
printf("last update : %s",ctime(&st.st_mtime));
printf("last access : %s",ctime(&st.st_atime));
access()
파일에 대하여 mode로 전해 엑세스 권한이 있는지 없는지 확인한다
prototype : int access(const char *pathname, int mode);
리턴값: 성공시 0, 실패시 -1
매크로 이름 | 비트패턴 | 액세스 권한 |
R_OK | 100 | 읽기 |
W_OK | 010 | 쓰기 |
X_OK | 001 | 실행 |
F_OK | 000 | 파일이 존재하는지 아닌지 |
'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글
File control (0) | 2022.11.09 |
---|