open | read

이전것/개발 2016. 4. 11. 20:30

file1.c 생성


$ vi file1.c


open( " 경로 " , flag , permission mode )


#include <stdio.h>


int main(void){

        int fd;

        fd = open("./test", 0);

        printf("fd = %d\n", fd);

        return 0;

}




실행 결과


1.

root@ubuntu:/work/system# vi file1.c

root@ubuntu:/work/system# gcc -o file file1.c

root@ubuntu:/work/system# ./file 

fd = -1 // 파일 오픈 실패


2.

root@ubuntu:/work/system# touch test

root@ubuntu:/work/system# ./file 

fd = 3 // fd는 3번.


flag 정보


flags

의미

1 O_RDONLY

읽기 전용으로 연다.

2 O_WRONLY

쓰기 전용으로 연다.

3 O_RDWR

읽기와 쓰기용으로 연다.

4 O_CREAT

해당 파일이 없으면 파일을 생성한다.

5 O_EXCL

해당 파일이 존재하면 실패하고 파일을 열지 않는다. (두 프로그램이 동시에 파일 생성하는 것 방지)

6 O_TRUNC

해당 파일이 존재하면 파일의 길이를 0으로 만든다. , 파일의 내용을 모두 지운다.

7 O_APPEND

쓰기 동작 시 파일의 끝에 추가된다.

8 O_NOCTTY

디바이스 파일인 터미널일 경우 터미널을 프로그램의 제어 터미널로 할당하지 않는다.

9 O_NONBLOCK

FIFO, 블록 특수 파일, 문자 특수 파일 등에서 입출력을 할 경우 읽거나 쓸 내용이 없더라도 장치가 준비 또는 사용 가능하게 되는 것을 기다리지 않고 바로 -1을 반환한다.

0 O_SYNC

쓰기 동작시 물리적인 쓰기 동작이 완료될 때까지 기다린다.



/usr/include/asm-generic/fcntl.h 에 플래그 설정이 되어있다.


#include <stdio.h>

#include <fcntl.h>


int main(void){

        int fd;

        fd = open("./test", O_RDONLY );

        printf("fd = %d\n", fd);

        return 0;

}


root@ubuntu:/work/system# gcc -o file file1.c

root@ubuntu:/work/system# ./file 

fd = 3 // 파일이 있음


root@ubuntu:/work/system# vi file1.c

root@ubuntu:/work/system# gcc -o file file1.c

root@ubuntu:/work/system# ./file

File Error  // 파일이 없음

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <errno.h>


int main(void){

        int fd;

        fd = open("./test", O_RDONLY);

        if (fd < 0) {

                printf("File Error \n");

                printf("Error Number = %d\n", errno); // out errno

                exit(1);

        }

        printf("fd = %d\n", fd);

        return 0;

}


root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
File Error 
Error Number = 2


/usr/include/asm-generic/errno-base.h


#define ENOENT 2 /* No such file or directory */



#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>


int main(void){

        int fd;

        fd = open("./test", O_RDONLY);

        if (fd < 0) {

                printf("File Error \n"); // 걍 프린트

                printf("Error Number = %d\n", errno); // 커널이 판단하는 에러의 번호 출력

                printf("%s\n", strerror(errno)); // 커널이 판단하는 에러의 문자열 출력

                exit(1);

        }

        printf("fd = %d\n", fd);

        return 0;

}



root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
File Error 
Error Number = 2
No such file or directory

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>


int main(void){

        int fd;

        fd = open("./test", O_RDONLY); // 읽기 전용으로 열기

        if (fd < 0) {

                printf("File Error \n");

                printf("Error Number = %d\n", errno); // printing errno

                printf("%s\n", strerror(errno));

                perror("open");

                exit(1);

        }

        printf("fd = %d\n", fd);

        return 0;

}


root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
File Error 
Error Number = 2
No such file or directory
open: No such file or directory


root@ubuntu:/work/system# touch test

root@ubuntu:/work/system# ./file

fd = 3


: 파일을 다시 생성

#include <stdio.h>

#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(void){
        int fd;
        fd = open("./test", O_WRONLY | O_CREAT, 0644); // 0644 퍼미션으로 만약 파일이 없으면 쓰기전용으로 파일을 생성
        if (fd < 0) {
                printf("File Error \n");
                printf("Error Number = %d\n", errno); // printing errno
                printf("%s\n", strerror(errno));
                perror("open");
                exit(1);
        }
        printf("fd = %d\n", fd);
        close(fd);
        return 0;
}

root@ubuntu:/work/system# rm test
root@ubuntu:/work/system# gcc -o file file1.c
root@ubuntu:/work/system# ./file
fd = 3



#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(void){
        int fd;
        fd = open("./test", O_WRONLY | O_CREAT | O_EXCL, 0644); // O_EXCL (Exclusive)은 파일이 있으면 새로 만들지 못하고 없을때만 만든다 
        if (fd < 0) {
                printf("File Error \n");
                printf("Error Number = %d\n", errno); // printing errno
                printf("%s\n", strerror(errno));
                perror("open");
                exit(1);
        }
        printf("fd = %d\n", fd);
        close(fd);
        return 0;
}

root@ubuntu:/work/system# gcc -o file file1.c

root@ubuntu:/work/system# ./file

File Error 

Error Number = 17

File exists

open: File exists



#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(void){
        int fd;
        fd = open("./test", O_WRONLY | O_CREAT | O_TRUNC, 0644);
        if (fd < 0) {
                printf("File Error \n");
                printf("Error Number = %d\n", errno); // printing errno
                printf("%s\n", strerror(errno));
                perror("open");
                exit(1);
        }
        printf("fd = %d\n", fd);
        close(fd);
        return 0;
}




#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>


int main(void) {

        int fd;

        int nr;

        char buffer[100];

        fd = open("./kmu", O_RDONLY);

        if ( fd < 0 ){

                perror("open");

                exit(1);

        }


        nr = read(fd, buffer, 5);

        printf("reading : %s\n", buffer);

        printf("%d bytes reading\n", nr);

        close(fd);

        return 0;

}


root@ubuntu:/work/system# gcc -o file2 file2.c

root@ubuntu:/work/system# ./file2

reading : kmu

ʂ8)w�

4 bytes reading






#include <unistd.h>


int main(void) {

        int fd;

        int nr;

        int fd2;

        int nw;

        char buffer[100];

        char buffer2[100] = "university\n";

        fd = open("./kmu", O_RDONLY);

        fd2 = open("./univ", O_RDWR | O_CREAT | O_APPEND, 0644);

        if ( fd < 0 ){

                perror("open");

                exit(1);

        }


        fd2 = open("./univ", O_RDWR | O_CREAT | O_APPEND, 0644); 


        nr = read(fd, buffer, 5);

        printf("reading : %s\n", buffer);

        printf("%d bytes reading\n", nr);


        nw = write(fd2, buffer2, 11);

        printf("%d bytes reading \n" , nr);

        close(fd);

        close(fd2);

        return 0;

}


root@ubuntu:/work/system# gcc -o file2 file2.c

root@ubuntu:/work/system# ./file2

reading : kmu


4 bytes reading

11 bytes reading 




#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>


int main(void) {

        int fd;

        int nr;

        int fd2;

        int nw;

        char buffer[100];


        fd = open("./kmu", O_RDONLY);


        if ( fd < 0 ){

                perror("open");

                exit(1);

        }


        fd2 = open("./univ", O_RDWR | O_CREAT | O_APPEND, 0644);

        while(1) {

                nr = read(fd, buffer, 5);


                if ( nr == 0) break;


                printf("reading : %s\n", buffer);

                printf("%d bytes reading\n", nr);


                nw = write(fd2, buffer, nr);

                printf("%d bytes reading \n" , nw);


        }

        close(fd);

        close(fd2);

        return 0;

}



root@ubuntu:/work/system# ./file

reading : korea�8I~�

5 bytes reading

5 bytes reading 

reading : 

kmu

�8I~�

5 bytes reading

5 bytes reading 

reading : unive�8I~�

5 bytes reading

5 bytes reading 

reading : rsity�8I~�

5 bytes reading

5 bytes reading 

reading : 

embe�8I~�

5 bytes reading

5 bytes reading 

reading : dded

�8I~�

5 bytes reading

5 bytes reading 

root@ubuntu:/work/system# cat univ

korea

kmu

university

embedded





'이전것 > 개발' 카테고리의 다른 글

module (2)  (0) 2016.05.09
module  (0) 2016.05.02
다항식 덧셈 프로그램 이중 연결리스트  (0) 2015.05.11
Wireshark_Intro_6.0  (0) 2015.03.24
AvlNode  (0) 2014.12.04
블로그 이미지

잉비니

,