리눅스 프로그래밍 파일 write실행하고 바로 close를 실행해줘야 하나요?
글쓴이: digntnwls / 작성시간: 목, 2022/04/14 - 7:15오후
안녕하세요!
리눅스에서 로그를 주기적으로 작성하는 프로그램을 작성하였는데요.
처음에 open을 실행하고 (APPEND와 SYNC 옵션을 사용했습니다)
write를 100ms 주기로 실행하면서 내용을 기록하다가
1시간마다 close하고 새로운 파일을 생성하도록 하였습니다.
"open-write-close" 패턴을 주기적으로 실행하는게 아니라
"open-write-write-...-write-close" 처럼 진행하면 안되나요?
현재 제가 작성한 코드를 계속 실행할 경우 파일이 손상될 가능성이 많을까요?
Forums:
...
fprintf 등등의 라이브러리 함수가 아니라 write를 썼다면, close를 하지 않아도 파일에 저장되는 데 문제가 없습니다.
그리고 O_SYNC가 필요한 경우는 그리 많지 않습니다. O_SYNC의 역할은 프로그램이 write를 실행하고 데이터가 실제로 디스크에 써지기 전에 *시스템이 비정상적으로 종료될 때* (전원이 꺼진다든지...) 데이터가 날아가는 것을 막아주는 것입니다.
그래서 만약 DB 엔진이나, 절대로 데이터가 날아가서는 안되는 입출금 기록이라든지, 뭐 이런 경우에는 필요하겠습니다만, 그런 경우가 아니라면 로그를 write할 때마다 디스크에 flush하는 건 불필요하고 오히려 시스템 성능을 심각하게 저하시킬 수 있습니다.
답변 감사합니다...
그럼 write() 실행 중 기기의 전원이 OFF 될 때 CPU에 입력되는 전원이 OFF되기까지 약 1초 정도의 시간이 소요되는데 그 전에 close()를 실행해 준다면 작성된 파일이 깨질 가능성은 거의 없다고 생각해도 될까요?
...
close는 그냥 파일 디스크립터를 닫을 뿐이지 파일의 내용이 디스크에 쓰여지는 것을 보장하지 않습니다. O_SYNC를 사용하지 않는 상태에서 파일이 디스크에 저장된 것을 보장하려면 fsync를 해야 합니다.
댓글 달기