관리 메뉴

너와 나의 스토리

리눅스 기반 파일 조작하기 본문

Computer Networks/실습

리눅스 기반 파일 조작하기

노는게제일좋아! 2019. 9. 25. 13:38
반응형
리눅스는 소켓을 파일의 일종으로 구분한다. 따라서 파일 입출력 함수를 소켓 입출력에, 다시 말해서 네트워크상에서의 데이터 송수신에 사용할 수 있다.
*참고로 윈도우는 리눅스와 달리 파일과 소켓을 구분함.

 

 

저 수준 파일 입출력(Low-level File Access)과 파일 디스크립터(File Descriptor)

  • 저 수준 파일 입출력:
    • ANSI의 표준 함수가 아닌, 운영체제가 제공하는 함수 기반의 파일 입출력
    • 표준이 아니기 때문에 운영체제에 대한 호환성이 없다.
    • 리눅스는 소켓도 파일로 간주하기 때문에, 저 수준 파일 입출력 함수를 기반으로 소켓 기반의 데이터 송수신이 가능하다.
  • 파일 디스크립터
    • 시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수를 의미
    • 즉, 운영체제가 만든 파일(소켓)을 구분하기 위한 일종의 숫자
    • 저 수준 파일 입출력 함수에게 소켓의 파일 디스크립터를 전달하면, 소켓을 대상으로 입출력을 진행한다.
    • 일반적으로파일과 소켓은 생성의 과정을 거쳐야 파일 디스크립터가 할당된다. 반면 아래의 세 가지 입출력 대상은 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당되는 파일 디스크립터들이다.
파일 디스크립터 대상
0 표준입력 (Standard Input)
1 표준출력 (Standard Output)
2 표준에러 (Standard Error)

 

 

 

파일 열기

#inlcude <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *path, int flag);
  • 인자:
    • path: 파일 이름을 나타내는 문자열의 주소 값 전달
    • flag: 파일의 오픈 모드 정보 전달
  • 반환:
    • 성공: 파일 디스크립터 반환  -> 이걸로 나중에 파일 닫음
    • 실패: -1 반환
  • flag에 전달 할 수 있는 값

 

 

파일 닫기

#include <unistd.h>

int close(int fd);
  • 인자:
    • fd: 닫고자 하는 파일 또는 소켓의 파일 디스크립터 전달
  • 반환:
    • 성공: 0 반환
    • 실패: -1 반환

 

 

파일에 데이터 쓰기

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t nbytes);
  • 인자:
    • fd: 데이터 전송 대상을 나타내는 파일 디스크립터 전달
    • buf: 전송할 데이터가 저장된 버퍼의 주소 값 전달
    • nbytes: 전송할 데이터의 바이트 수 전달
  • 반환:
    • 성공: 전달한 바이트 수
    • 실패: -1 반환
  • primitive 자료형 -> <sts/types.h> 헤더파일에 typedef 선언을 통해서 정의되어 있다
    • size_t: unsigned int
    • ssize_t: signed int

 

 

 

 

 

 

 

 

출처: [열혈 TCP/IP 소켓 프로그래밍] 

반응형
Comments