![Unix 시스템에서 파일을 "읽기()" 또는 "쓰기()"하려면 명시적으로 "open()" 및 "close()" 파일을 사용해야 하는 이유는 무엇입니까?](https://linux55.com/image/84298/Unix%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%22%EC%9D%BD%EA%B8%B0()%22%20%EB%98%90%EB%8A%94%20%22%EC%93%B0%EA%B8%B0()%22%ED%95%98%EB%A0%A4%EB%A9%B4%20%EB%AA%85%EC%8B%9C%EC%A0%81%EC%9C%BC%EB%A1%9C%20%22open()%22%20%EB%B0%8F%20%22close()%22%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC%20%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
Unix 파일 시스템 설계에 왜 존재하고 존재합니까 open()
?close()
OS가 처음으로 감지 read()
하거나 write()
호출되어 open()
일반적으로 수행하는 작업을 수행할 수는 없습니까?
답변1
데니스 리치가 언급한«유닉스 시분할 시스템의 진화»그 open
와 는 close
처음부터 read
시스템에 있었습니다 .write
creat
없는 시스템은 상상할 수 open
없지만 close
디자인이 복잡해질 것이라고 생각합니다. 특히 매우 제한된 RAM으로 UNIX가 시작된 오래된 컴퓨터에서는 일반적으로 읽기 및 쓰기 호출을 한 번만 수행하는 것이 아니라 여러 번 호출하기를 원합니다. 현재 파일 위치를 유지하는 핸들이 있으면 이 작업이 단순화됩니다. 핸들을 반환 하려면 핸들과 자체 반환 상태 쌍을 반환해야 합니다 read
. write
쌍의 핸들 부분은 다른 모든 호출에 쓸모가 없으므로 이 배열을 어색하게 만듭니다. 커서 상태를 커널에 남겨두면 단순한 버퍼링보다 더 효율적입니다. 길찾기와 관련된 일부 비용도 있습니다. 핸들이 있으면 비용을 한 번만 지불할 수 있습니다. 더욱이 UNIX 세계관의 일부 파일에는 파일 시스템 경로조차 없습니다(또는 없습니다. 이제 그런 것이 있습니다 /proc/self/fd
).
답변2
그러면 모든 read
sum write
호출은 각 작업에 대해 다음 정보를 전달해야 합니다.
- 파일 이름
- 파일 권한
- 호출자가 추가 중인지 생성 중인지 여부
- 발신자가 누구인지완벽한파일 처리(사용하지 않는 읽기 버퍼를 삭제하고 쓰기 버퍼가 실제로 쓰기를 완료하는지 확인)
독립을 고려하든수신 전화 open
, read
및 write
는 close
단일 목적 I/O보다 간단합니다.정보귀하의 디자인 컨셉에 따라. Unix 개발자들은 단일 작업(또는 프로그램)으로 모든 작업을 수행하는 대신 다양한 방법으로 결합할 수 있는 간단한 작업과 절차를 사용하기로 결정했습니다.
답변3
UNIX의 디자인 선택은 파일 시스템의 일부가 아닌 부분을 포함하여 "모든 것이 파일"이라는 것이므로 파일 핸들의 개념이 중요합니다. 예를 들면 테이프 드라이브, 키보드 및 스크린(또는 텔레타이퍼!), 펀치 카드/테이프 판독기, 직렬 연결, 네트워크 연결 및 "파이프"라고 불리는 다른 프로그램에 대한 (UNIX의 주요 발명품) 직접 연결 등이 있습니다.
와 같은 많은 간단한 표준 UNIX 유틸리티, 특히 원래 버전을 살펴보면 and 에 대한 호출이 포함되어 있지 않고 and 만 grep
포함되어 있음을 알 수 있습니다 . 파일 핸들이 설정되었습니다.open()
close()
read
write
외부프로그램은 쉘에 의해 실행되고 시작 시 전달됩니다. 따라서 프로그램은 파일에 쓰는지 다른 프로그램에 쓰는지 신경 쓸 필요가 없습니다.
open
파일 설명자를 얻는 다른 방법은 socket
, listen
, pipe
, dup
및 파이프를 통해 파일 설명자를 보내는 Heath Robinson 메커니즘입니다.https://stackoverflow.com/questions/28003921/sending-file-descriptor-by-linux-socket
편집하다:일부 유인물간접적인 수준과 이를 통해 O_APPEND가 제대로 작동하는 방법을 설명하세요. inode 데이터를 메모리에 보관하면 시스템이 다음 쓰기 작업 시 해당 데이터를 다시 가져올 필요가 없습니다.
답변4
Open()은 사용 중인 파일을 잠그는 방법을 제공합니다. 운영 체제가 자동으로 파일을 열고 파일을 읽거나 쓴 다음 파일을 다시 닫는 경우 다른 응용 프로그램이 작업 간에 해당 파일을 변경하는 것을 막을 수 없습니다.
이는 관리할 수 있지만(많은 시스템이 비독점적 파일 액세스를 지원함) 단순화를 위해 대부분의 응용 프로그램은 자신이 여는 파일이 변경되지 않는다고 가정합니다.