시스템 레벨 파일 조작

interviewsangu·2020년 7월 19일
0

소켓 프로그래밍

목록 보기
2/8
post-thumbnail

리눅스

  • 리눅스는 소켓을 파일의 일종으로 구분하기 때문에 파일 입출력 함수를 네트워크 데이터 송수신에 사용할 수 있다.
  • Low Level File Access에 파일 디스크립터를 전달 해 소켓을 대상으로 입/출력을 진행한다. 여기서 Low Level을 표준 C 함수로 제공되지 않고 시스템 레벨에서 제공하는 것들을 의미한다.
  • 파일 디스크립터 혹은 윈도우에서 파일 핸들이라 부르는 것은 파일이나 소켓을 구분하기 위해 숫자를 지정한 것에 지나지 않는다. 편히 쓰기 위해 숫자를 지정하는 것이다.
    0, 1, 2는 표준을 나타내며 소켓 생성시 3부터 시작한다. 0은 표준 입력, 1은 표준 출력, 2는 표준 에러를 나타낸다.
  • 파일 열기 또는 생성시 전달하는 flag 값에는 다음과 같은 것들이 있으며 이를 | 연산으로 묶어서 사용할 수 있다.
    (1) O_CREAT : 필요 시 파일 생성
    (2) O_TRUNC : 기존 데이터 전부 삭제
    (3) O_APPEND : 기존 데이터 뒤에 붙이기
    (4) O_RDONLY : 읽기 전용으로 오픈
    (5) O_WRONLY : 쓰기 전용으로 오픈
    (6) O_RDWR : 읽기, 쓰기 모드로 오픈

시스템에서 정의하는 자료형의 이름에 _t가 붙어 있는 이유
: 이는 primitive 자료형을 의미하며 일반적으로 sys/type.h에 typedef 선언을 통해 정의되어 있다. 기본 자료형에 다른 이름을 붙여논 것으로 시스템이 변경됨에 따라 자료형의 표현 방식이 달라질 수 있는데 이 때, typedef 선언만 변경해 코드의 변경을 최소화 할 수 있기 때문이다.

int open(const char *path, int flag);
//성공 시 파일 디스크립터, 실패 시 -1 반환
int close(int fd);
//성공 시 0, 실패 시 -1 반환
ssize_t write(int fd, const void *buf, size_t nbytes);
//파일 디스크립터, 버퍼의 주소 값, 바이트 수 전달
ssize_t read(int fd, void *buf, size_t nbytes);
//성공 시 수신한 바이트 수, 실패 시 -1 반환

low_open.c

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

void error_handling(char* message);

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;
}

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

low_read.c

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

#define BUF_SIZE 100

void error_handling(char* message);

int main(void)
{
	int fd;
	char buf[BUF_SIZE];
	
	fd=open("data.txt", O_RDONLY);
	if( fd==-1)
		error_handling("open() error!");
	
	printf("file descriptor: %d \n" , fd);
	
	if(read(fd, buf, sizeof(buf))==-1)
		error_handling("read() error!");

	printf("file data: %s", buf);
	
	close(fd);
	return 0;
}

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

윈도우

이론만 보고 넘어간다.

0개의 댓글