File 에서 Read할때 락 걸수 있는 방법이 없을까요?

metalwolf의 이미지

안녕하세요... 궁금중이 있어서 여쭤 봅니다.

두 프로세스 간에 한 File을 공유 합니다. 파일의 데이터 각각의 라인을 '레코드'라 칭하겠습니다.

궁금한 것은 두 프로세스 간에 Read 할때 레코드를 선점 할수 있냐는 거죠.

write는 락이 걸리니까 문제는 없는데 Read에서는 기본적으로 락이 걸리지

않아 난감합니다. 데이터베이스를 사용할 수 없고 순수하게 파일을 데이터

베이스 처럼 사용하려 하기 때문에 발생된 문제 입니다. 혹시 저같은 사례를

겪으셔서 해결 하신 분은 리필 꼭 부탁드립니다.

아 환경은 Solaris 입니다.

^____^;

vness의 이미지

"write는 락이 걸리니까 문제는 없는데 Read에서는 기본적으로 락이 걸리지 않아 난감합니다" 라는 말씀이 이해가 잘 가질 않는군요.

기본적으로 파일의 read/write에는 lock이 존재하질 않습니다.

fcntl을 이용하면 원하시는 record lock을 구현하실 수 있으실 듯합니다.

struct flock {
short l_type; /* lock operation type */
short l_whence; /* lock base indicator */
off_t l_start; /* starting offset from base */
off_t l_len; /* lock length; l_len == 0 means
until end of file */
long l_sysid; /* system ID running process holding lock */
pid_t l_pid; /* process ID of process holding lock */
}

처음부터 20byte까지의 data를 read locking 하고 싶으시면.. (현재 file을 open한 바로 직후였다고 가정하고) 아래는 대강의 코드입니다.

struct flock lock;

lock.l_type = F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_end = 20;
lock.l_pid = getpid();

fcntl(fd, F_SETLK, &lock); // record에 read lock.
.............

lock.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &lock); // record에서 read lock 해제.

기억나는데로 적은거라서 실수가 있을지도 모르겠습니다. 보다 정확한 내용은 man fcntl 해보시길 바랍니다.

moonzoo의 이미지

간단히 lockf 를 이용하셔도 됩니다.

lockf(fd, F_LOCK,0L);

lockf(fd, F_ULOCK,0L);

마지막은 size옵션인데..man page를 참조하세요.

metalwolf의 이미지

답변 감사합니다. 헌데 문제는 두 프로세스가 물리적으로 분리 되어 있다는

겁니다. emc 장비로 파일 시스템을 공유 하고 물리적으로 다른 두 프로세스가

공유를 한다는 거죠. 그럼 위 함수들은 물리적으로 다른 프로세스가 서로 락을

걸어도 보장 해 주는 건가요? 그리고 만약 보장해 준다면 락을 걸어놓고 그 프로

세스가 죽었을시 어떻게 해야 되는건가요? 제 말은 파일시스템에 락이 존재

하는지 알고 싶습니다. os차원 이나 프로세스 차원 으로선 두 프로세스가 한

서버에 있는게 아니라서요.. 답변 꼭 부탁드립니다. ^^;

^____^; 방가여

댓글 달기

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