모든 바이트가 기록될 때까지 쓰기 명령을 강제로 차단하는 방법이 있습니까?

모든 바이트가 기록될 때까지 쓰기 명령을 강제로 차단하는 방법이 있습니까?

매뉴얼 페이지에 따르면, "write count bytes" 명령을 작성한 다음 쓰여진 실제 바이트 수를 반환합니다. 따라서 모든 바이트가 파일 설명자에 기록되었는지 확인하려면 쓰기를 루프에 넣고 모든 바이트가 기록되었는지 모니터링해야 합니다.

그러나 블록이 기록될 때까지 기록되도록 파일 설명자를 구성하는 방법이 있습니까?모두바이트가 기록되었습니까?

편집* 차이가 있으면 파이프라인에 쓰고 있습니다.

답변1

당신은 시스템 호출만 언급했으므로 시스템 호출 인터페이스를 통해 모든 데이터를 OS에 전달하기를 원한다고 가정합니다.

따라서 모든 바이트가 파일 설명자에 기록되었는지 확인하려면 쓰기를 루프에 넣고 모든 바이트가 기록되었는지 모니터링해야 합니다.

예.

내가 (Linux에서) 테스트한 한 대부분의 쓰기는 실제로 모든 것이 기록될 때까지 차단됩니다. 여기에는 최소한 일반 파일과 (내가 기억하는 한) 파이프에 쓰는 것이 포함됩니다. 물론 파일 설명자를 비차단 모드로 설정하면 이런 일이 발생하지 않을 수 있으며(일반 파일에서 작동하는지 확실하지 않음) 시스템 호출 중간에 신호를 받아 중단될 수 있습니다. 여기서 정확한 동작은 시스템에 따라 다를 수 있습니다.

그러나 모든 바이트가 기록될 때까지 블록이 기록되도록 파일 설명자를 구성하는 방법이 있습니까?

아니요.

시스템 호출이 신호에 의해 중단되고 제어가 프로그램으로 다시 전달되면 계속하기를 원하지 않을 수도 있습니다. 따라서 계속할지 여부를 결정하는 것은 애플리케이션에 달려 있습니다.

답변2

두 가지 옵션이 있습니다:

O_SYNC 플래그와 함께 open을 사용하세요. 맨페이지에서:

       O_SYNC Write operations on the file will complete according to the  re‐
              quirements  of  synchronized  I/O  file integrity completion (by
              contrast with the synchronized  I/O  data  integrity  completion
              provided by O_DSYNC.)

              By  the  time write(2) (or similar) returns, the output data and
              associated file metadata have been transferred to the underlying
              hardware  (i.e.,  as though each write(2) was followed by a call
              to fsync(2)).  See NOTES below.

또는 쓰기 호출 후에 fsync(2) 호출을 사용하면 데이터가 명시적으로 플러시됩니다.

성능 및 보증 요구 사항에 따라 둘 중 하나를 선호할 수 있습니다.

귀하의 질문은 파이프에 관한 것이므로 필요하지 않습니다. 모든 쓰기는 파이프로 이동하며 오류가 발생하지 않는 한(예: 비차단 모드에서 파이프가 가득 참), 동기화/직접 또는 플래그나 특수 호출이 필요하지 않는 한 작성된 것으로 간주됩니다. 파이프 판독기가 데이터를 읽을 때까지 쓰기에서 반환을 지연하는 것에 대해 이야기하고 있다면 요구 사항을 다시 확인해야 합니다. 독자가 액세스할 때까지 쓰기가 항상 차단되도록 제한된 버퍼가 있는 파이프를 만드는 것이 가능하지만 왜 그러한 시나리오를 설계하고 테스트하는 데 어려움을 겪을까요? 독자의 피드백이 정말로 필요하다면 명시적으로 요청해야 할 수도 있습니다. 파이프에서 읽기를 호출한 후 판독기가 즉시 죽을 가능성은 항상 있으므로 파이프를 차단하여 시나리오를 만드는 것은 쓸모가 없어 보입니다.

관련 정보