운영체제 기본/Linux/파일 시스템 콜/파일 오프셋과 열린 파일의 수명: 두 판 사이의 차이
lseek·pread·pwrite, dup의 위치 공유, close 수명과 fsync 보강 |
잔글 관리자님이 운영체제 기본/Linux/파일 시스템 콜/파일 위치와 수명 문서를 운영체제 기본/Linux/파일 시스템 콜/파일 오프셋과 열린 파일의 수명 문서로 이동했습니다: 문서 내용을 직관적으로 나타내는 명사형 제목으로 정리 |
||
| (같은 사용자의 중간 판 2개는 보이지 않습니다) | |||
| 1번째 줄: | 1번째 줄: | ||
{{이전 다음 문서 | {{이전 다음 문서 | ||
|이전=← 이전 문서<br />[[운영체제 기본/ | |이전=← 이전 문서<br />[[운영체제 기본/Linux/파일 시스템 콜/read와 write|read와 write]] | ||
|목차=[[운영체제 기본/ | |목차=[[운영체제 기본/Linux/파일 시스템 콜|파일 시스템 콜 목차]] | ||
|다음=마지막 문서 | |다음=마지막 문서 | ||
}} | }} | ||
| 52번째 줄: | 52번째 줄: | ||
</pre> | </pre> | ||
복제한 fd가 남아 있거나 진행 중인 입출력·메모리 매핑이 참조를 보유하면 객체가 즉시 사라지지 않는다. 예를 들어 파일을 매핑한 뒤 원래 fd를 닫아도 매핑은 유지되며, <code>munmap()</code>은 별개의 주소 공간 해제다. 자세한 과정은 [[운영체제 기본/ | 복제한 fd가 남아 있거나 진행 중인 입출력·메모리 매핑이 참조를 보유하면 객체가 즉시 사라지지 않는다. 예를 들어 파일을 매핑한 뒤 원래 fd를 닫아도 매핑은 유지되며, <code>munmap()</code>은 별개의 주소 공간 해제다. 자세한 과정은 [[운영체제 기본/Linux/메모리 매핑|Linux의 메모리 매핑]]에서 다룬다. | ||
fd 슬롯은 닫기 후반부보다 먼저 해제된다. 따라서 닫기에서 오류가 났다고 같은 번호로 <code>close()</code>를 무작정 재시도하면, 다른 스레드가 그 번호로 새로 연 파일을 닫을 수 있다. <code>close()</code>는 파일 이름을 디렉터리에서 제거하는 <code>unlink()</code>와도 다른 연산이다.<ref name="man-close">[https://man7.org/linux/man-pages/man2/close.2.html Linux man-pages, close(2)].</ref><ref name="open"/><ref name="file"/> | fd 슬롯은 닫기 후반부보다 먼저 해제된다. 따라서 닫기에서 오류가 났다고 같은 번호로 <code>close()</code>를 무작정 재시도하면, 다른 스레드가 그 번호로 새로 연 파일을 닫을 수 있다. <code>close()</code>는 파일 이름을 디렉터리에서 제거하는 <code>unlink()</code>와도 다른 연산이다.<ref name="man-close">[https://man7.org/linux/man-pages/man2/close.2.html Linux man-pages, close(2)].</ref><ref name="open"/><ref name="file"/> | ||
| 60번째 줄: | 60번째 줄: | ||
일반적인 버퍼드 <code>write()</code>의 성공, <code>close()</code>의 성공, 저장 장치에 대한 동기화 완료는 서로 다른 조건이다. <code>fsync(fd)</code>는 <code>do_fsync()</code> → <code>vfs_fsync()</code> → <code>vfs_fsync_range()</code>를 거쳐 파일의 <code>f_op->fsync</code>를 호출한다. 파일 데이터와 필요한 메타데이터의 반영을 기다리며, 동기화 과정에서 발견된 오류도 호출자가 확인해야 한다.<ref name="sync">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/sync.c?h=v6.12 Linux v6.12 fs/sync.c], do_fsync, vfs_fsync, vfs_fsync_range.</ref> | 일반적인 버퍼드 <code>write()</code>의 성공, <code>close()</code>의 성공, 저장 장치에 대한 동기화 완료는 서로 다른 조건이다. <code>fsync(fd)</code>는 <code>do_fsync()</code> → <code>vfs_fsync()</code> → <code>vfs_fsync_range()</code>를 거쳐 파일의 <code>f_op->fsync</code>를 호출한다. 파일 데이터와 필요한 메타데이터의 반영을 기다리며, 동기화 과정에서 발견된 오류도 호출자가 확인해야 한다.<ref name="sync">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/sync.c?h=v6.12 Linux v6.12 fs/sync.c], do_fsync, vfs_fsync, vfs_fsync_range.</ref> | ||
<code>fdatasync()</code>도 데이터를 동기화하되, 메타데이터는 수정된 데이터를 다시 읽는 데 필요한 항목으로 한정한다. 새 파일 이름이나 이름 변경까지 장애 후 보존해야 한다면 관련 디렉터리의 동기화도 따로 고려해야 한다.<ref name="man-fsync">[https://man7.org/linux/man-pages/man2/fsync.2.html Linux man-pages, fsync(2)].</ref> 여기서의 구분은 ‘버퍼를 전달했다’, ‘fd를 닫았다’, ‘저장 완료를 요청하고 확인했다’가 같은 사건이 아니라는 점이다. 페이지 캐시와 라이트백의 관계는 [[운영체제 기본/ | <code>fdatasync()</code>도 데이터를 동기화하되, 메타데이터는 수정된 데이터를 다시 읽는 데 필요한 항목으로 한정한다. 새 파일 이름이나 이름 변경까지 장애 후 보존해야 한다면 관련 디렉터리의 동기화도 따로 고려해야 한다.<ref name="man-fsync">[https://man7.org/linux/man-pages/man2/fsync.2.html Linux man-pages, fsync(2)].</ref> 여기서의 구분은 ‘버퍼를 전달했다’, ‘fd를 닫았다’, ‘저장 완료를 요청하고 확인했다’가 같은 사건이 아니라는 점이다. 페이지 캐시와 라이트백의 관계는 [[운영체제 기본/Linux/파일시스템/페이지 캐시|페이지 캐시]]에서 이어진다. | ||
== 참고 문헌 == | == 참고 문헌 == | ||
| 66번째 줄: | 66번째 줄: | ||
{{이전 다음 문서 | {{이전 다음 문서 | ||
|이전=← 이전 문서<br />[[운영체제 기본/ | |이전=← 이전 문서<br />[[운영체제 기본/Linux/파일 시스템 콜/read와 write|read와 write]] | ||
|목차=[[운영체제 기본/ | |목차=[[운영체제 기본/Linux/파일 시스템 콜|파일 시스템 콜 목차]] | ||
|다음=마지막 문서 | |다음=마지막 문서 | ||
}} | }} | ||
{{운영체제 기본 둘러보기}} | {{운영체제 기본 둘러보기}} | ||