fflush와 fsync의 차이
내 생각에는 말이지…fsync()
한다fflush()
내부, 따라서 사용fsync()
냇물도 괜찮고.하지만 네트워크 I/O에서 실행되면 예상치 못한 결과가 나타납니다.
내 코드 조각:
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* get fd of the FILE pointer */
fd = fileno(fp);
#ifndef WIN32
ret = fsync(fd);
#else
ret = _commit(fd);
fclose(fp);
하지만 그런 것 같다_commit()
데이터가 플러시되지 않습니다(Windows에서 시도했는데 Linux 내보내기 파일 시스템에 데이터가 기록되었습니다).
코드를 다음과 같이 변경했을 때:
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* fflush the data */
fflush(fp);
fclose(fp);
데이터를 플러시합니다.
혹시?_commit()
같은 일을 하다fflush()
입력 사항 있나요?
fflush()
에서 동작하다FILE*
내부 버퍼를 플래시하기만 하면 됩니다.FILE*
응용 프로그램을 OS에 배포합니다.
fsync
는 하위 레벨에서 동작하며 OS에 버퍼를 물리 미디어에 플러시하도록 지시합니다.
OS는 사용자가 파일에 쓰는 데이터를 대량으로 캐시합니다.OS가 모든 쓰기를 강제로 드라이브에 적용하면 작업이 매우 느려집니다. fsync
(특히) 을 사용하면 데이터가 드라이브에 도달하는 시기를 제어할 수 있습니다.
또한 fsync/commit은 파일 기술자에서도 작동합니다.그것은 에 대한 지식이 없다.FILE*
버퍼를 플러시할 수 없습니다. FILE*
는 어플리케이션에 존재하며 파일 기술자는 일반적으로 OS 커널에 존재합니다.
fflush()
그리고.fsync()
를 사용하여 저장 미디어에 데이터를 쓸 수 있습니다(그러나 항상 가능한 것은 아닙니다).
- 최초 사용
fflush(fp)
출력 스트림(fp
가 되다FILE *
에서 얻은fopen
또는 표준 스트림 중 하나.stdout
또는stderr
스트림과 관련된 버퍼의 내용을 OS에 씁니다. - 그 후
fsync(fileno(fp))
OS에 자신의 버퍼를 저장 미디어에 쓰도록 지시합니다.
단, 주의해 주십시오.fileno()
그리고.fsync()
모든 시스템에서 사용할 수 없는 POSIX 함수입니다.특히 Microsoft 레거시 시스템에서는 대체 기능을 사용할 수 없습니다._fileno()
,_fsync()
또는_commit()
...
표준 C 함수fflush()
및 POSIX 시스템콜fsync()
개념적으로 비슷합니다. fflush()
는 C 파일스트림 상에서 동작합니다(FILE
오브젝트)를 사용하여 휴대할 수 있습니다. fsync()
POSIX 파일 기술자로 동작합니다.둘 다 버퍼링된 데이터를 수신처로 보냅니다.
POSIX 시스템에서는 각 C 파일스트림에 관련된 파일 기술자가 있으며 필요에 따라 파일 기술자로 동작하는 POSIX 시스템콜에 위임함으로써 C 파일스트림 상의 모든 조작이 구현됩니다.
어떤 이는 에 대한 전화라고 생각할 수 있다.fflush
POSIX 시스템 상에서는, POSIX가 원인이 되어,write
파일 스트림의 버퍼,파일 스트림의 버퍼에 있는 모든 데이터의 콜에 이어의 요구에 있고 그 어떤 정보를 말.fsync()
그 파일 스트림의 파일 설명자.해당 파일 스트림의 파일 기술자를 지정합니다.그래서 POSIX시스템에 사용할 필요 없는 전화 POSIX따라서에게 따라오라는 시스템에서는 다음 콜을 수행할필요가 없습니다.fflush
과 통화 좀 에의 함께요구와에fsync(fileno(fp))
. 하지만 사실이다. 즉 있는 전화 그게 사실인가요 하지만는 것이다?이 문제에 대해fsync
부터에서fflush
아니, 아니요,전화하고 있습니다.fflush
한 POSIX시스템에 POSIX의미가 없습니다 같은상에서는 다음과 시스템 있다는 뜻은 아니다.fsync
라고 할 것이다.호출됩니다.
의 C표준의 C표준입니다.fflush
말하다
[ ] 스트림에 대한 쓰기되지 않은 데이터가 호스트 환경에 전달되어 파일에 쓰이게 됩니다.
데이터를 쓰는 것이 아니라 쓰는 것이라고 하는 것은 호스트 환경에 의한 추가 버퍼링이 허용된다는 것을 의미합니다."호스트 환경"에 의한 버퍼링에는 POSIX 환경의 경우 다음과 같은 내부 버퍼링이 포함될 수 있습니다.fsync
C 이 표준에서는 이 POSIX를 호출할 을 알 수 있습니다.fsync
.
의 POSIX 표준 설명은 C 시멘틱스의 확장으로서 다음과 같이 선언하지 않습니다.fsync
출됩니니다다
python(https://docs.python.org/2/library/os.html)의 아래 문서는 매우 명확하다고 생각합니다.
os.fsync(fd) fileescriptor fd 파일을 디스크에 강제로 씁니다.Unix 에서는 네이티브 fsync() 함수를 호출합니다.Windows 에서는 MS _commit() 함수를 호출합니다.
Python 파일 객체 f로 시작하는 경우 f.flush()를 먼저 실행하고 os.fsync(f.fileno()를 실행하여 f와 관련된 모든 내부 버퍼가 디스크에 기록되도록 합니다.
가용성:2.2.3 이후 UNIX 및 Windows.
최근 변경 내용을 디스크에 강제로 적용하려면 sync() 또는 fsync() 함수를 사용합니다.
fsync()는 지정된 파일의 모든 데이터와 메타데이터를 영구 스토리지 디바이스와 동기화합니다.해당 파일이 닫히기 직전에 호출해야 합니다.
sync()는 변경된 모든 파일을 디스크에 커밋합니다.
간단하게 말하면 다음과 같습니다.
fsync()
스트리밍하지 않는 파일(파일 기술자 포함)
fflush()
파일 스트림을 사용합니다.
여기 또한 인간의 도움이다.
int fflush(FILE *stream); // flush a stream, FILE* type
int fsync(int fd); // synchronize a file's in-core state with storage device
// int type
언급URL : https://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync
'programing' 카테고리의 다른 글
자바에서 다이아몬드 연산자(<>)의 포인트는 무엇입니까? (0) | 2022.07.15 |
---|---|
확산 구문(...)은 mapGetters에서 정확히 어떻게 작동합니까? (0) | 2022.07.15 |
구문 분석 중 예기치 않은 JSON 입력 끝 (0) | 2022.07.15 |
Vue.js에서 Tabulator와 함께 사용하기 위한 Moment.js 라이브러리를 포함한 문제 (0) | 2022.07.15 |
opengl: glFlush()와 glFinish() (0) | 2022.07.15 |