프로그래밍을 하다가 잠시 딜레이를 줘야하는 상황이 있는데요..

weezzle의 이미지

프로그래밍을 하다가 잠시 딜레이를 줘야하는 상황이 있는데요..

두 프로그램이 있는데..
A라는 프로그램은 txt파일을 이용해 작업을 하고 있고,
B라는 프로그램은 txt파일이 갱신되었는지 감시하고 있다가 갱신되면
그 파일에 접근하는 형태의 프로그램입니다.

근데 txt파일이 갱신되면 아주 미세한 시간 차이 때문인지..
B라는 프로그램이 갱신되기 이전의 파일 내용을 가져 오더라구요,..

그래서 잠시 딜레이를 주고자

sleep(1);

이걸 넣어주니... 정상적으로 출력되는데...
아시다시피 저기 1은 1초라서 약간의 끊김을 줘서...좀 어색(?)하네요...ㅋㅋ

제 생각에는 0.1정도만 줘도 될꺼라고 생각되는데...
그 정도의 시간 딜레이는 어떻게 만들어야 할까요??

danskesb의 이미지

sleep보다 시간을 더 촘촘하게 줄 수 있는 usleep이 있습니다.

파일 변경 사항을 감시하려면 inotify도 있습니다. http://kldp.org/node/88828

---- 절취선 ----
http://blog.peremen.name

weezzle의 이미지

감사합니닷...ㅎ

jos77의 이미지

리눅스나 유닉스에서 미리 메모리에 읽어놓은 txt 파일을 가져오는 cache 일 가능성이 있기 때문에
sleep() 이 동작한다면 그냥 '시스템함수' 하나 부르는 것으로 cache 를 막을 수도 있습니다. sleep(0) 도 통할 겁니다. (socket 통신에서 자주 사용함)
물론 가장 확실한 방법은 inotify 지만... 리눅스의 inotify 는 디렉토리 제한 25개 가 있으므로 주의하세요

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

bushi의 이미지

주장하시는 바는 전혀 납득이 되지도 않고, 이때까지 봐왔던 수많은 코드에도 그런 류의 꼼수는 못 봤습니다.
개별 파일시스템의 버그인지 기능인지 알 수 없는 뭔가때문에 fsync(), msync() 가 반드시 필요한 경우가 있긴합니다만,
예기치않은 power fail 상황에 대한 대비책으로 sync()는 부족하다는 것 정도를 의미할 뿐입니다.
file cache(page cache)는 파일에 대해 유일하며, 읽건 쓰건 한 곳에 합니다.
그렇지 않다면 page cache 가 존재할 이유가 없습니다.
유저모드에서 커널모드로 복사된 이후엔, 누가 어디서 어떻게 읽어도 같은 값이 읽힙니다. 그게 실제로 디스크에 씌어졌는지와는 별개로.

jos77 님이 주장하시는 것은 강제로 scheduling 이 일어나도록 하는 꼼수에 가깝다고 생각하는데,
sched_yield() 가 이미 준비되어 있습니다.
pthread 에선... GNU 에서는 pthread_yield() 를 제공하지만 posix 가 아니고,
제대로 설계를 했다면 이런게 필요없으니 제껴도 되겠네요.

그리고, 리눅스 inotify 의 디렉토리 제한 25개가 무슨 말인지요 ?

[bushi@rose net]$ cat /proc/sys/fs/inotify/max_queued_events 
16384
[bushi@rose net]$ 
[bushi@rose net]$ cat /proc/sys/fs/inotify/max_user_instances 
128
[bushi@rose net]$ 
[bushi@rose net]$ cat /proc/sys/fs/inotify/max_user_watches 
8192
[bushi@rose net]$ 

OTL

댓글 달기

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