리눅스 프로그래밍 파일 write실행하고 바로 close를 실행해줘야 하나요?

digntnwls의 이미지

안녕하세요!

리눅스에서 로그를 주기적으로 작성하는 프로그램을 작성하였는데요.

처음에 open을 실행하고 (APPEND와 SYNC 옵션을 사용했습니다)
write를 100ms 주기로 실행하면서 내용을 기록하다가
1시간마다 close하고 새로운 파일을 생성하도록 하였습니다.

"open-write-close" 패턴을 주기적으로 실행하는게 아니라
"open-write-write-...-write-close" 처럼 진행하면 안되나요?

현재 제가 작성한 코드를 계속 실행할 경우 파일이 손상될 가능성이 많을까요?

jick의 이미지

fprintf 등등의 라이브러리 함수가 아니라 write를 썼다면, close를 하지 않아도 파일에 저장되는 데 문제가 없습니다.

그리고 O_SYNC가 필요한 경우는 그리 많지 않습니다. O_SYNC의 역할은 프로그램이 write를 실행하고 데이터가 실제로 디스크에 써지기 전에 *시스템이 비정상적으로 종료될 때* (전원이 꺼진다든지...) 데이터가 날아가는 것을 막아주는 것입니다.

그래서 만약 DB 엔진이나, 절대로 데이터가 날아가서는 안되는 입출금 기록이라든지, 뭐 이런 경우에는 필요하겠습니다만, 그런 경우가 아니라면 로그를 write할 때마다 디스크에 flush하는 건 불필요하고 오히려 시스템 성능을 심각하게 저하시킬 수 있습니다.

digntnwls의 이미지

그럼 write() 실행 중 기기의 전원이 OFF 될 때 CPU에 입력되는 전원이 OFF되기까지 약 1초 정도의 시간이 소요되는데 그 전에 close()를 실행해 준다면 작성된 파일이 깨질 가능성은 거의 없다고 생각해도 될까요?

jick의 이미지

close는 그냥 파일 디스크립터를 닫을 뿐이지 파일의 내용이 디스크에 쓰여지는 것을 보장하지 않습니다. O_SYNC를 사용하지 않는 상태에서 파일이 디스크에 저장된 것을 보장하려면 fsync를 해야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.