[질문] unlink나 rename사용시에 나타나는 문제?

초코리의 이미지

C프로그램에서

unlink나 rename사용시에

open으로 열려진 파일에 전근을 하여도 에러가 나지않네요.

errno에 EACCESS같은 에러가 생길줄 알았는데

아무일없는듯이 파일의 이름이 지워지고 파일이 삭제되는데요...

열려진 파일을 rename하거나 unlink시에

에러를 받는 받법이 있을까요??

아니면
open시에 파일명은 table로 만들어두었다가 관리해야할까요?

jyj9782의 이미지

에러나지 않는게 당연한거 아닐까요
touch /x
vi /x

-------------------
rm -rf /x

해도 지워지듯이..

힘내세요.

초코리의 이미지

vi로 읽은 상태에서 rm으로 지워도

잘지워지는거 봐서

원래 지워지게 만들어 진것 같은데

그래도 파일을 읽고 있는 상태에서 지워지면 난감하잖아요..

뭔가 있을것 같기도 한데 찾아 봐도 없네요..

같은 프로세서 내에서 open으로 연것을 등록하고 close한것을 지우고 하는 곳을 만들어

unlink할때나 rename할때 그것을 보고 수행하는 방법밖에 없는지...

API단에서 체크하는것이 없을까요?

moonzoo의 이미지

보통 file을 지운다거나 쓴다거나 할경우에는

배타적 lock을 걸고 작업을 하셔야 합니다.

lock을 거는 방법으로는 lockf 나 fcntl등을 이용할 수 있습니다.

초코리의 이미지

moonzoo님께서 적어 주신 것을 가지고
좀 찼아봤습니다.

http://people.kldp.org/~kabin/doc/unixcfaq2.txt
http://www.ezdoum.com/upload/2/20020519002657/sys.txt
이곳에 자료가 있었네요.

그리고 APUE 원서에 Advanced I/O 368페이지에
fcntl로 라킹하는 법이 나오네요.

자료좀더 읽어보고 적용해 보겠습니다.

답변 감사드립니다.

charsyam의 이미지

초코리 wrote:
vi로 읽은 상태에서 rm으로 지워도

잘지워지는거 봐서

원래 지워지게 만들어 진것 같은데

그래도 파일을 읽고 있는 상태에서 지워지면 난감하잖아요..

뭔가 있을것 같기도 한데 찾아 봐도 없네요..

같은 프로세서 내에서 open으로 연것을 등록하고 close한것을 지우고 하는 곳을 만들어

unlink할때나 rename할때 그것을 보고 수행하는 방법밖에 없는지...

API단에서 체크하는것이 없을까요?

vi의 경우에 해당 파일이 열리는 것이 아니라 .swp 파일이 생겨서 그 파일을 에디팅합니다. 그럼 고운 하루. 시스템 콜을 따라가다 보니깐 나오더군요.

=========================
CharSyam ^^ --- 고운 하루
=========================

eungkyu의 이미지

원래 파일을 오픈한 채로 지울 수 있습니다. 윈도우랑은 다른 점이지요.

리눅스에서는 파일을 열면 ref count가 하나씩 올라갑니다. 만약 ref count가 1 이상인 상황에서 unlink로 파일을 지우면, 더이상 open할 수는 없지만 이미 open되어있는 descriptor로는 평범하게 작업을 할 수 있습니다. 그러다가 close를 해서 ref count가 0이 되면 실제로 그 파일을 지우게 됩니다.

각종 에디터가 임시파일을 만들기 때문이 아니고 커널에서 파일 관리를 그렇게 합니다. APUE를 잘 읽어보시면 자세히 이해할 수 있습니다 :)

일부로 임시파일을 다룰때 열고 unlink한 다음 작업하기도 합니다.

댓글 달기

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