저 수준 파일 입출력과 파일 디스크립터
저 수준 파일 입출력
- ANSI의 표준함수가 아닌, 운영체제가 제공하는 함수 기반의 파일 입출력.
- 표준이 아니기 때문에 운영체제에 대한 호환성이 없다.
- 리눅스는 소켓도 파일로 간주하기 때문에 저 수준 파일 입출력 함수를 기반으로 소켓 기반의 데이터 송수신이 가능하다.
파일 디스크립터 |
대상 |
0 |
표준입력 : Standard Input |
1 |
표준출력 : Standard Output |
2 |
표준에러 : 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 |