fsync 예제

    예를 들어 foo/bar.txt 파일(예: foo 디렉터리 내의 파일 bar.txt)을 읽으려면 디렉터리 foo와 연결된 데이터 Blob에 액세스해야 합니다. 이 불투명 한 데이터 Blob을 구문 분석 한 후 시스템은 bar.txt에 대 한 항목을 가져오고 관련 된 데이터 Blob을 엽니다. (그리고 네, 분명히 루트 항목이있다, 첫 번째 수준 항목에 대한 참조를 저장, 모든 파일 하향식에 액세스 할 수 있도록) 시스템 호출은 Linux 커널에서 구현됩니다. 프로그램이 시스템 호출을 하면 인수가 패키징되어 커널로 전달되며, 이 인수는 호출이 완료될 때까지 프로그램 실행을 대신합니다. 시스템 호출은 일반적인 함수 호출이 아니며 커널로 제어를 전송하려면 특별한 절차가 필요합니다. 그러나 GNU C 라이브러리(GNU/Linux 시스템과 함께 제공되는 표준 C 라이브러리의 구현)는 Linux 시스템 호출을 함수로 래핑하여 쉽게 호출할 수 있습니다. 열기 및 읽기와 같은 낮은 수준의 I/O 함수는 Linux의 시스템 호출의 예입니다. fsync() 함수는 계속하기 전에 파일을 수정해야 하는 프로그램에서 사용해야 합니다. 예를 들어 간단한 트랜잭션 기능이 포함된 프로그램은 트랜잭션으로 인해 발생한 파일이나 파일에 대한 모든 수정 사항을 기록하도록 하는 데 사용할 수 있습니다.

    fdatasync()는 fsync()와 유사하지만 후속 데이터 검색을 올바르게 처리할 수 있도록 메타데이터가 필요한 경우가 아니면 수정된 메타데이터를 플러시하지 않습니다. 예를 들어 st_atime 또는 st_mtime(각각 마지막 액세스 시간 및 마지막 수정 시간 참조)에 대한 변경은 후속 데이터 읽기가 올바르게 처리될 필요가 없기 때문에 플러싱이 필요하지 않습니다. 반면에 파일 크기(st_size)를 변경하려면 ftruncate(2)라고 말함)이 만들었으며 메타데이터 플러시가 필요합니다. 일관성은 파일 시스템 수준에서 보장됩니다. 그러나 작업 영역에서 특정 작업을 직렬화/잠그고 일종의 세대 번호를 변경하여 트랜잭션을 커밋하는 등 디스크에 데이터베이스를 빌드하는 경우에도 동일한 보증이 필요합니다. 원자성: 쓰기 작업은 한 번에 완전히 실행되며 다른 작업(예: 다른 사람이 같은 위치에 쓰는 경우)과 인터리브되지 않습니다. 예를 들어, 이름 바꾸기() 작업 중간에 정전이 수행되면 파일 시스템이 „이상한“ 상태로 두지 않으며 메타데이터가 손상되었기 때문에 파일 이름에 연결할 수 없습니다. (즉. 작업이 손실되거나 작업이 커밋됩니다.) 라이브러리 함수는 프로그램 외부의 라이브러리에 있는 일반 함수입니다. 지금까지 제시한 대부분의 라이브러리 함수는 표준 C 라이브러리인 libc에 있습니다. 예를 들어 getopt_long 및 mkstemp는 C 라이브러리에 제공되는 함수입니다. 프로그램에서 시스템 호출 및 신호를 시청하려면 추적을 호출한 다음 프로그램 및 명령줄 인수를 호출하면 됩니다.

    예를 들어 hostname 1 명령에 의해 호출되는 시스템 호출을 보려면 이 명령을 사용합니다. e, 예를 들어. 이는 클라이언트/서버 아키텍처를 처리할 때 절대적으로 중요합니다: 클라이언트는 문제 없이 언제든지 연결 또는 트랜잭션이 중단될 수 있지만(즉, 트랜잭션은 나중에 다시 시도됩니다), 서버가 이를 승인하면 이벤트가 없어야 합니다. (예를 들어, 상업적 거래 또는 디지털 서명의 책임을 생각하십시오). 이러한 이유로 내부 시스템 또는 하드 디스크 캐시에서 커밋된 데이터를 갖는 것은 명백한 이유로 내구성이 없습니다(예를 들어 RAID 어레이에서 배터리를 사용하는 경우 이러한 정전이 발생하지 않는다는 보장이 없는 경우).