1. test.txt파일의 내용을 test2.txt파일에 복사 (없으면 생성)
▷ 실행코드
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<fcntl.h>
- #define FILE_SIZE 1024
- int main(){
- int fd, fd2;
- char * readData = (char *)malloc(sizeof(char) * FILE_SIZE);
- memset(readData, 0, 1024);
- if( ( fd = open("test.txt", O_RDONLY)) < 0){
- printf("open() error!\n");
- exit(1);
- }
- read(fd, readData, FILE_SIZE);
- if( ( fd2 = open("test2.txt", O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0){
- printf("fd2 open() error\n");
- exit(1);
- }
- write(fd2, readData, strlen(readData));
- close(fd);
- close(fd2);
- free(readData);
- return 0;
- }
▶ 실행결과
: test2.txt파일을 생성하여 test.txt의 파일내용을 복사하여 붙여넣음.
2. cat명령어 구현하기 (명령어 인자로 '>'와 '>>'를 사용하기)
▷ 실행코드
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<fcntl.h>
- #define FILE_SIZE 1024
- int main(int argc, char * argv[]){
- int fd;
- char * readData = (char *)malloc(sizeof(char) * FILE_SIZE);
- char * writeData = (char *)malloc(sizeof(char) * FILE_SIZE);
- if(argc == 2) // (simple) file print
- {
- if( ( fd = open(argv[1], O_RDONLY)) < 0){ // not exists files
- printf("File not exists\n");
- exit(1);
- }
- read(fd, readData, FILE_SIZE);
- printf("%s print\n", argv[1]);
- printf("%s\n", readData);
- close(fd);
- free(readData);
- }
- else if(argc > 2) // parameteres exist(append OR overwrite)
- {
- if(strcmp(argv[1], ">") == 0) // overwrite.
- fd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
- else if(strcmp(argv[1], ">>") == 0) // append.
- fd = open(argv[2], O_CREAT | O_WRONLY | O_APPEND, 0644);
- else
- {
- printf("%s don`t parameters\n", argv[1]);
- exit(1);
- }
- scanf("%s", writeData);
- write(fd, writeData, strlen(writeData));
- close(fd);
- free(writeData);
- }
- return 0;
- }
▶ 실행결과
1) cat명령어 (명령행 인자로 > 옵션 사용)
: cat명령어와 동일한 옵션을 사용하였다.
1) 파일내용 출력 (기본 실행)
2) >옵션으로 파일내용 덮어쓰기(overwrite)
3) >>옵션으로 파일내용 덧붙이기(append)
3. dup사용 (파일 디스크립터 복사)
▷ 실행코드
- #include<stdio.h>
- #include<stdlib.h>
- #include<fcntl.h>
- int main(){
- int fd, copy_fd;
- if( (fd = open("test.txt", O_RDONLY)) < 0){
- printf("open(0 error\n");
- exit(1);
- }
- copy_fd = dup(fd);
- printf("fd : %d\n", fd);
- printf("copy_fd : %d\n", copy_fd);
- close(fd);
- close(copy_fd);
- return 0;
- }
▶ 실행결과
: fd는 3번, dup()로 복사된 파일 디스크립터 copy_fd는 4번을 가진다.
파일 디스크립터는 0부터 차례대로 채워서 생성이 되는데, 0~2는 기본 파일 디스크립터에 해당하므로 3번과 4번을 차례대로 부여하였다.
4. dup사용 (복사된 디스크립터로 출력)
- 그렇다면 복사된 파일 디스크립터로 출력이 가능한지 살펴보자.
▷ 실행코드
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<fcntl.h>
- int main(){
- int fd, copy_fd;
- char * readData = (char *)malloc(sizeof(char) * 1024);
- memset(readData, 0, 1024);
- if( ( fd = open("test.txt", O_RDONLY)) < 0){
- printf("open() error\n");
- exit(1);
- }
- copy_fd = dup(fd);
- read(copy_fd, readData, 1024);
- printf("fd : %d\n", fd);
- printf("copy_fd : %d\n", copy_fd);
- printf("%s\n", readData);
- close(fd);
- close(copy_fd);
- free(readData);
- return 0;
- }
▶ 실행결과
: 기존의 디스크립터를 O_RDONLY로 읽기전용으로 파일을 open한 뒤 복사한 copy_fd로 read()하여 파일 내용을 읽어온 뒤 출력하는 예제이다.
결과를 보니, 복사한 디스크립터도 기존 디스크립터와 같은 기능을 수행할 수 있다.
5. dup사용 (기존 파일 디스크립터 삭제 후 디스크립터 확인하기)
- 기존 파일디스크립터를 삭제하고 복제된 파일 디스크립터는 그대로 사용이 가능한지 살펴보자.
▷ 실행코드
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<fcntl.h>
- int main(){
- int fd, copy_fd;
- char * writeData = "dup Test";
- char * readData = (char *)malloc(sizeof(char) * 1024);
- memset(readData, 0, 1024);
- fd = open("anyFile.txt", O_CREAT | O_RDWR | O_TRUNC, 0644);
- copy_fd = dup(fd);
- printf("dup(fd)\n");
- printf("fd : %d\n", fd);
- printf("copy_fd : %d\n", copy_fd);
- close(fd);
- printf("fd close");
- printf("fd : %d\n", fd);
- printf("copy_fd : %d\n", copy_fd);
- write(copy_fd, writeData, strlen(writeData));
- lseek(copy_fd, 0, SEEK_SET);
- read(copy_fd, readData, 1024);
- printf("%s\n", readData);
- close(copy_fd);
- free(readData);
- return 0;
- }
▶ 실행결과
: 파일 디스크립터 복사할때 기능도 복사되었고 기존 파일디스크립터에 의존성을 갖지 않는다. 중간에 lseek함수를 통해서 다시 파일을 읽을때 처음부터 읽을 수 있도록 만들었다.
write를 사용하면 파일이 write()함수가 실행된 만큼 이동하게 된다. 즉, 파일을 write한 부분부터 가리키게 된다. 그래서 read하게되면 아무값도 출력되지 않는다.
그러므로 lseek(파일디스크립터, 시작할위치, 앞이나 뒤 부분); 를 통해서 read할 파일 위치를 명시해야 한다.
6. dup2사용 (표준에러를 파일로 출력하기.)
▷ 실행코드
- #include<stdio.h>
- #include<stdlib.h>
- #include<fcntl.h>
- int main(){
- int fd, fd2;
- fd = open("errorLog.txt", O_CREAT | O_RDWR | O_TRUNC, 0644);
- dup2(fd, 2);
- if( (fd2 = open("anyfile.txt", O_RDONLY)) < 0){
- perror("occurs error\n");
- }
- close(fd);
- return 0;
- }
▶ 실행결과
: dup2를 사용해서 표준에러 출력(파일 디스크립터로 2번)을 파일로 출력하였다.
(anyfile.txt라는 존재하지 않는 파일로 고의로 에러를 발생시킨것임.)
7. dup2의 사용 (파일 디스크립터 값을 확인해보자.)
▷ 실행코드
- #include<stdio.h>
- #include<fcntl.h>
- int main(){
- int fd;
- fd = open("test.txt", O_CREAT | O_RDONLY, 0644);
- dup2(fd, 2);
- printf("fd : %d\n", fd);
- return 0;
- }
▶ 실행결과
: 역시 새로운 파일 디스크립터 번호를 할당받는다.
댓글 없음:
댓글 쓰기