본문 바로가기

임베디드 리눅스

네트워크 프로그래밍-파일 디스크립터

728x90
반응형

안녕하세요? WH입니다.

네트워크 프로그래밍 부분은 사실 간단한 예제만 코드로 보여드리고 넘어가려고 했는 데,

처음 글을 작성하고 보니 사실 너무 불친절하다는 생각이 들었습니다.

그래서 무엇을 정리해서 무엇을 먼저 적어야 할까 하다보니

정말 끝도 없더군요. 네트워크 계층만 설명하자,

코드에 시스템 콜만 덧 붙이자, 그러다 파일 보내는 것까지만 추가하자,

그러다 라이브러리까지 포함시킬까 하게 되고..

사실 어디까지 포함시킬지는 저도 모르겠습니다.

다만 코드 전에 다뤄볼 수 있는 내용들은 다 다루고

코드를 올려볼까 생각 중입니다.

 

여튼 이번 글은 파일 디스크립터 입니다.

 

파일 디스크립터

파일 디스크립터란 운영체제가 특정 파일에 할당해준 정수 값

 

이걸 왜 알아야 하냐, 이 정수 값은 소켓 역시 가지고 있습니다. 물론 리눅스에서요. 왜냐면 리눅스는 모든 것이 파일이라는 유닉스의 정신을 이어 받거든요. 즉, 앞으로 설명 드리겠지만, socket(), accept(), 등은 모두 파일 디스크립터 값을 반환하는 데, 0-2는 표준 입력, 출력, 에러에 각각 할당하고 있어 3부터 가능하다는 점 짚고 넘어가도록 하겠습니다.

 

파일 디스크립터 할당

파일 디스크립터 값은, 사용자 지정 파일을 읽거나 쓰는 경우에 open() 함수를 이용해서 할당 받을 수 있는데요.

int fd = open("test.txt", O_WRONLY);

위와 같은 형태로 쓴답니다. 즉 open() 함수의 파라미터로 파일명과, 파일을 읽을(쓸) 때 옵션을 지정해주면 고유의 파일 디스크립터 값이 반환됩니다. 파일 디스크립터 값이 주어지면 해당 값을 이용해 해당 파일에 접근할 수 있고, 파일마다 하나의 접근 지정자가 생기는 효과가 있으므로 편하게 파일에 접근할 수 있게 되지요.

 

파일에 내용쓰기

write 함수를 이용하여, buf의 데이터를 파일에 쓸 수있는데요. buf란 어렵게 생각할 것 없이, 데이터를 저장하기 위한 임시 저장소 같은 느낌으로 생각해 주시면 됩니다.

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

void error_handling(char * message)
{
	fputs(message, stderr);
    fputc('\n',stderr);
    exit(1);
}
int main(void){
	int fd;
    char buf[] = "This is test";
    
    fd = open("test.txt",O_CREAT|O_WRONLY|O_TRUNC);
    if( fd == -1)
    	erroer_handling("open() error.\n";
        
    printf("file descriptor: %d\n",fd);
    
    if(write(fd,buf,sizeof(buf))==-1)
    	error_handling("write() error.\n");
        
    close(fd);
    return 0;
}

파일 내용 읽기

read 함수를 이용하여, test.txt 파일을 읽을 수 있습니다. 자 그럼 이 두가지가 나중에 네트워크 프로그래밍에서 어떻게 활용될 것이냐, 파일의 내용을 전달할 때 open으로 파일을 열어 파일 디스크립터를 할당 받은 다음 read로 buf 에 옮기고 해당 buf의 내용을 소켓을 통해 클라이언트에게 파일을 보내줄 수 있겠죠? 사실 이것 때문에 지금 이 내용을 하는 거랍니다. 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#define MAXSIZE 1024

void error_handling(char * message)
{
	fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

int main(){
	int fd;
    char buf[MAXSIZE];
    
    fd = open("test.txt",O_RDONLY);
    if(fd==-1)
    	error_handling("open error.\n");
    printf("file descriptor : "%d\n",fd);
    
    if(read(fd, buf, sizeof(buf))==-1)
    	error_handling("read error.\n");
    printf("file data : %s",buf);
    close(fd);
    return 0;
}

 

위에서 색칠한 부분을 구현하려면 어떻게하면 될까요? printf 있는 부분을 고치면 되겠죠? 이번 글 역시 기초적인 내용이지만 알고 있으면 도움이 되리라는 생각에 작성하게 되었습니다. 그럼 이만 WH였습니다.

728x90
반응형