저 수준 파일 입출력과 파일 디스크립터

저 수준 파일 입출력

 - ANSI의 표준함수가 아닌, 운영체제가 제공하는 함수 기반의 파일 입출력.

 - 표준이 아니기 때문에 운영체제에 대한 호환성이 없다.

 - 리눅스는 소켓도 파일로 간주하기 때문에 저 수준 파일 입출력 함수를 기반으로 소켓 기반의 데이터 송수신이 가능하다.

파일 디스크립터 

대상 

표준입력 : Standard Input 

표준출력 : Standard Output 

표준에러 : Standard Error 


파일 디스크립터

 - 운영체제가 만든 파일(그리고 소켓)을 구분하기 위한 일종의 숫자

 - 저 수준 파일 입출력 함수는 입출력을 목적으로 파일 디스크립터를 요구한다.

 - 저 수준 파일 입출력 함수에게 소켓의 파일 디스크립터를 전달하면, 소켓을 대상으로 입출력을 진행한다.


파일 열기와 닫기

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>


int open(const char *path, int flag); // path 파일 이름을 나타내는 문자열의 주소값 전달

                                              // flag 파일의 오픈모드 정보 전달.

-> 성공 시 파일 디스크립터, 실패시 -1 반환, 


오픈모드 

의미 

O_CREAT 

필요하면 파일을 생성 

O_TRUNC 

기존 데이터 전부 삭제 

O_APPEND 

기존 데이터 보존하고, 뒤에 이어서 저장 

O_RDONLY 

일기 전용으로 파일 오픈 

O_WRONLY 

쓰기 전용으로 파일 오픈 

O_RDWR 

읽기, 쓰기 겸용으로 파일 오픈 


#include <unistd.h>


int close(int fd); // fd 닫고자 하는 파일 또는 소켓의 파일 디스크립터 전달.

-> 성공 시 O, 실패시 -1 반환

-> open함수 호출 시 반환된 파일 디스크립터를 이용해서 파일 입출력을 진행하게 된다.


파일에 데이터 쓰기

#include <unistd.h>


ssize_t write(int fd, const void *buf, size_t nbytes);  //fd 데이터 전송대상을 나타내는 파일 디스크립터 전달.

                                                                  //buf 전송할 데이터가 저장된 버퍼의 주소 값 전달.

                                                                  //nbytes 전송할 데이터의 바이트 수 전달.

->성공 시 전달한 바이트 수, 실패 시 -1 반환


int main(void) {

    int fd;

    char buf[] = "Let's go!\n";

    fd=open("data.txt", O_CREAT|O_WRONLY|O_TRUNC);

    if(fd==-1)

        error_handling("open() error!");

    printf("file descriptor: %d \n", fd);

    if(write(fd, buf, sizeof(buf)) == -1)

        error_handling("write() error!");

    close(fd);

    return 0;

}


파일 디스크립터와 소켓


int main(void) {

int fd1, fd2, fd3;

fd1=socket(PF_INET, SOCK_STREAM, 0);

fd2=open("test.dat", O_CREAT|O_WRONLY|O_TRUNC);

fd3=socket(PF_INET, SOCK_DGRAM, 0);


printf("file descriptor 1 : %d\n", fd1);

printf("file descriptor 2 : %d\n", fd2);

printf("file descriptor 3 : %d\n", fd3);

close(fd1); close(fd2); close(fd3);

return 0;

결론 => 리눅스에서는 소켓 = 파일, 파일과 소켓을 동일하게 간주한다.


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

우분투 16.04 폰트 설정 변경  (0) 2016.11.16
우분투 16.04 기본셋팅  (0) 2016.11.10
device driver 3  (0) 2016.05.23
device driver (2)  (0) 2016.05.16
device driver  (0) 2016.05.09
블로그 이미지

잉비니

,