리눅스 기반 파일 조작
리눅스에서의 소켓 조작은 파일 조작과 동일하게 간주되기 때문에 파일에 대해서 자세히 알 필요가 있다.
리눅스는 윈도우와 달리 소켓을 파일의 일종으로 구분한다.
따라서 파일 입출력 함수를 소켓 입출력에 사용할 수 있다.
다시 말해서 네트워크 상에서의 데이터 송수신에 파일 입출력 함수가 사용될 수 있다.
참고로 윈도우는 리눅스와는 달리 파일은 파일로 간주하고 소켓은 소켓으로 구분하여 간주한다.
그렇기에 윈도우에서는 파일 입출력 함수를 소켓 입출력에 사용할 수 없다.
윈도우에서는 소켓 입출력에서 사용할 수 있는 별도의 데이터 송수신 함수를 사용해야 한다.
-
※ 저 수준 파일 입출력(Low-level File Access) ※
이미 프로그래밍을 해본 사람은 저 수준 이라는 단어가 나와서 어려운 내용이라고 짐작하는 분들도 있을 것이다.
하지만 여기서 말하는 저 수준이란
" 표준에 상관없이 운영체제가 독립적으로 제공하는~ "
이라는 의미로 해석하면 된다.
즉, 이후 포스팅에서 설명하는 함수들은 리눅스에서 제공하는 함수이지, ANSI 표준에서 정의한 함수가 아니다.
리눅스에서 제공하는 파일 입출력 함수를 사용하려면 파일 디스크립터에 대한 개념을 먼저 세워야 한다.
-
※ 파일 디스크립터(File Descriptor) ※
파일 디스크립터는 시스템으로부터 할당받은 파일 또는 소켓에 부여된 정수를 의미한다.
참고로 C언어를 공부하면서 여러분이 입출력의 대상으로 여겨왔던,
표준 입출력 및 표준 에러에도 리눅스에서는 다음 사진과 같이 파일 디스크립터를 할당하고 있다.
-
-
일반적으로 파일과 소켓은 생성의 과정을 거쳐야 파일 디스크립터가 할당된다.
반면 위에서 보이는 세가지 입출력 대상은 별도의 생성과정을 거치지 않아도
프로그램이 실행되면 자동으로 할당되는 파일 디스크립터들이다.
참고로 입문자나 초보자 입장에서 파일 디스크립터를 반환 값이라고 해석해도 좋다.
반환 값이라고 해석한다는걸 명심해두면 나중에 이해가 쉽게 될 것이다.
하지만 파일 디스크립터와 반환 값의 의미는 살짝 다르다는 것도 명심한다.
-
※ 파일 디스크립터(File Descriptor) 예시 ※
예를 들어 A라는 자녀(딸 또는 아들)와 B라는 부모(엄마 또는 아빠)가 있다고 가정할 때
자녀 A는 매일 밤마다 자기 전에 부모님인 B에게
"자기 전에 자녀에게 꼭 읽어줘야 하는 토끼와 거북이와 각종 동물들의 운동회 동화책"
이라는 책을 읽어 달라고 한다.
하지만 매일 밤마다 저렇게 긴 책의 이름을 말하기에는 너무 귀찮기도 하고 힘들다.
그래서 자녀인 A와 부모님인 B는 서로 앞으로
"자기 전에 자녀에게 꼭 읽어줘야 하는 토끼와 거북이와 각종 동물들의 운동회 동화책"
라는 책의 이름을
"운동회 책"
이라고 부르기로 약속했다.
그 뒤로 자녀인 A는 부모님인 B에게 매일 밤마다 자기 전에
"운동회 책 읽어주세요"라고 말한다.
그러면 부모님인 B는
"자기 전에 자녀에게 꼭 읽어줘야 하는 토끼와 거북이와 각종 동물들의 운동회 동화책"
이라는 제목의 책을 가져와서 읽어준다.
이때, 부모님인 B는 운영체제이고, 자녀인 A는 프로그래머(여러분)를 의미한다.
그리고 위에서 예시에는 "운동회 책"이라고 예시를 들었지만,
실제로 운영체제는 정수형 숫자를 부여한다.
그러므로 위 예시에서는 "운동회 책"이 파일 디스크립터이다.
그리고 책은 파일 또는 소켓을 의미한다.
즉, 여러분들이 파일 또는 소켓을 생성할 때마다 운영체제는 해당 파일 또는 소켓에
정수형 숫자 하나를 부여해준다.
그 정수형 숫자가 운영체제와 여러분이 편하게 대화하는 방법이 될 것이다.
결국 파일 디스크립터란 운영체제가 여러분이 만든 파일 또는 소켓의 지칭을 편히 하기 위해서 부여된 숫자이다.
참고로 윈도우에서는 파일 디스크립터라 하지 않고 파일 핸들이라고 한다.
-
다음 포스트에서는 리눅스 기반 파일 조작 함수들을 알아보자.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
_t로 끝나는 자료형 (0) | 2021.02.02 |
---|---|
(리눅스)파일 입출력 함수 (0) | 2021.02.02 |
(리눅스) 클라이언트[client] 프로그램 구현 (0) | 2021.02.02 |
(리눅스) 서버[server] 프로그램 구현 (0) | 2021.02.01 |
(리눅스)클라이언트 측 함수 선언 과정의 비유와 역할 (0) | 2021.02.01 |