[질문]상대적으로 느린 하드디스크 속도에의해 발생하는 문제?

psycoder의 이미지

업데이트 프로그램을 만들다가 다음과 같은 문제를 겪었습니다.
업데이트 루틴은 다음과 같습니다.
1. 서버에서 업데이트 버전정보가 담긴 파일을 다운받아 새버전인지 검사
2. 새버전이면 업데이트 프로그램을 실행한후 자신은 exit
3. 업데이트 프로그램은 업데이트 수행후 새버전의 프로그램을 실행

이렇게 아주 간단한데요..
문제는 1과 3에서 발생했습니다.
버전정보파일엔 분명 새버전인데 현재버전과 동일버전으로 나와서 업데이트를 수행않하고, 강제로 업데이트를 수행해도 새버전을 받기만하고 실행을 않하는 겁니다.
며칠동안 머리를 쥐어뜯으며 고민하다가 결국 파일을 다운받은후 다음처리를 하기전에 sleep()을 해줘서 해결했습니다.
이렇게해서 해결되는걸로 봐서 아마두 다음 루틴을 수행할 당시에 디스크상엔 다운받은 파일이 존재하지 않아서 발생하는 문제로 추측되는데요..(제 생각이 맞는지요?)

제 생각이 맞다면 제가했던데로 sleep()으로 해결하는게 괜찮은 방법인가요?
혹은 더 좋은 방법이 있을까요?
사실 sleep()도 참 애매하더군요..
어떨땐 3초만 해줘도되고 어떨땐 5초정도 해줘야 할때도 있고, 또 하드웨어 사양에 따라 또 틀려질수도 있구요..

제가 만든 프로그램은 윈도우용이구요 fat32/ntfs에서 테스트한겁니다.
리눅스 혹은 다른 운영체제 혹은 다른 파일시스템에선 이런 문제가 발생하지 않는지도 궁금하군요.

bugiii의 이미지

업데이터가 실행된 후에 자신이 종료되었다는 것을 업데이트가 알아차리도록 하면 됩니다. Sleep 은 믿을게 못됩니다.

psycoder의 이미지

bugiii wrote:
업데이터가 실행된 후에 자신이 종료되었다는 것을 업데이트가 알아차리도록 하면 됩니다. Sleep 은 믿을게 못됩니다.

제가 글재주가 없어서 잘못 이해하셨나봅니다.
문제는 업데이트 프로그램이 구버전의 프로그램이 종료되었는지 몰라서 그런게 아니구요..
새버전을 다운받은후 이 다운받은 걸 실행을 못한다는 겁니다.
제가 추측하는 바로는 다운로드는 됐으나 이걸 운영체제(혹은 커널, 혹은 파일시스템상에 갱신이 안되서..)가 아직 인식하기 전에 실행할려고 해서 그런게 아닌가 생각합니다.

근본적인 해결책은 파일이 존재하는가 일정시간동안 체크하면 되겠지만, 이 일정시간이란것도 네트웍 사정등에 따라 천차만별이므로 저같은 초보에겐 적당한 대책이 안떠오르네요..(그래서 가장 간단하게 sleep()으로 해결했구요. :oops: )
혹시 이런 비슷한 프로그램을 만들어보셨던 분 계시면 조언 부탁드립니다.

ssggkim의 이미지

download 받을 때는 어떤 function을 쓰시나요? 그리고 받을 때 사용하는 protocol은 어떤 건지요?

bugiii의 이미지

다운로드 받을 때 새로운 이름으로 저장합니까? 아니면 기존 메인과 같은 이름입니까?

crimsoncream의 이미지

혹시 이게 필요하신 건가요?

man fflush
man fsync

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

psycoder의 이미지

ssggkim wrote:
download 받을 때는 어떤 function을 쓰시나요? 그리고 받을 때 사용하는 protocol은 어떤 건지요?

소켓으로 짤까 혹은 ftp 관련 api를 가져다가 짤까 하다 빨리 손쉽게 만들려는 욕심에 WinExec(ncftp....)로 해결했습니다.(상용 프로그램도 아니구 저 혼자 취미삼아 만드는 거거든요. :oops: )

bugiii wrote:
다운로드 받을 때 새로운 이름으로 저장합니까? 아니면 기존 메인과 같은 이름입니까?

기존 메인과 같은 이름입니다.

이런..제가 잘못 알고있었군요. :oops:
WinExec()의 리턴타임이 ncftp...이 완료된후 리턴하는줄 알았는데 ncftp..을 fork(맞나요?)후 바로 리턴하나 보네요.
돌다리도 두들겨봤어야 했는데 좋지두 않은 제 기억력만 믿은게 화근이였습니다.
쉽고 빠르게 할려다가 더 어렵고 오래 걸렸네요.. :oops:
일단 _access()로 일정시간동안 파일이 존재하는가 체크하는 루틴으로 해결했습니다.
관심 가져주신 모든분들께 감사드립니다. :D

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.