File IO

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