/* file_create.c: create a new file, by mjson. jinn_o@naver.com */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#define MAX_BUF 64
char fname[]="newfile.txt";
char dummy_data[]="abcdefg\n";
int main(){
int fd,write_size,read_size;
char buf[MAX_BUF];
fd=open(fname,O_RDWR|O_CREAT|O_EXCL,0664);
if(fd<0){
printf("Can`t create %s file with errno %d\n",fname,errno);
exit(1);
}
write_size=write(fd,dummy_data,sizeof(dummy_data));
printf("write_size=%d\n",write_size);
close(fd);
fd=open(fname,O_RDONLY);
read_size=read(fd,buf,MAX_BUF);
printf("read_size=%d\n",read_size);
write_size=write(STDOUT_FILENO,buf,read_size);
close(fd);
}
위의 코드를 자세히 설명하면 다음과 같다.
fd=open(fname,O_RDWR|O_CREAT|O_EXCL,0664);
파일 디스크립터를 지정함과 동시에 open 시스템 콜 함수를 호출하고 있다. 지정한 파일 경로인 fname을 여는 것인데, flags 옵션들이 O_RDWR(읽고쓰기), O_CREAT(새로운 파일 생성), O_EXCL(배타적으로 생성, 즉 이미 존재하는 파일이면 에러를 출력하란 뜻) 이다. 또한 마지막에 0664는 8진수 표기법이다. 664는 110 110 100 을 의미하며 각각 user 부분의 rwx, group 부분의 rwx, 그외 사용자들 부분의 rwx 에 해당한다.
만약, 이미 존재하는 파일이라면 뒷 부분에 내용을 추가하는 방식으로 파일을 생성하고 싶다면, O_APPEND 옵션을 추가하면 된다.
>> 권한설정 및 8진수표기법 자세히 알아보기
https://jinn-o.tistory.com/121?category=971524
만든 create 함수 실행시켜보기
두번째 실행했을 때 오류가 나는 이유는 파일을 open 할 때 배타적으로 생성했기 때문이다.
'컴퓨터 공학 > 시스템 프로그래밍' 카테고리의 다른 글
[리눅스 프로그래밍] 기타 시스템 콜 (0) | 2021.10.10 |
---|---|
[LPI 실습] lseek() 실습 : 원하는 위치부터 파일 읽기 (0) | 2021.10.10 |
[LPI 실습] cat 명령어 직접 만들어보기(2) do_cat() (0) | 2021.10.10 |
[LPI 실습] cat 명령어 직접 만들어보기(1) mycat() (0) | 2021.10.10 |
[LPI 실습] write() 시스템 콜 직접 사용해보기 (0) | 2021.10.10 |