리눅스에서 파일의 open과 close에 관한 질문입니다

camerabug의 이미지

리눅스에서 파일을 open해서 사용할 경우에
내부적으로도 계속 open된 상태를 유지하는지,
아니면 필요한 작업을 마치고 close 한 후에
파일에 대해 write 작업이 있을 때마다
다시 open해서 사용하고 close를 하는지 궁금합니다.

아는 분께 얘기를 들으니 윈도우에서는
파일을 사용하고 있더라도 내부적으로는 close를 한 상태이고
write 할 때마다 open과 write, close를 반복한다고 하셔서요
그래서 파일을 open한 상태에서도 탐색기를 띄워
그 파일의 이름을 바꿀 수 있는거라고 그러시더라구요.
리눅스에서도 close 상태로 있는지 의문이 들었습니다.

그리고 정말로 close 되는지 아닌지를 제가 직접 확인하려면
어떤 방법으로 해야 하는지도 알려주시면 감사하겠습니다.

익명 사용자의 이미지

파일을 필요할때 읽고 닫아버릴지 아니면 계속 열어둘지는 프로그래머가 프로그램의 특성에 맞게 정하는것이 아니었던가요?

특별히 윈도우 프로그램이라고 해서 파일을 계속 열어놔서는 안된다는 것을 들어본적이 없는것 같은데요..
그리고 한 프로그램이 파일을 열고 있을때 탐색기 같은데서 파일의 이름이나 경로를 바꿀수 없습니다.
파일이 엉망이 되긴 하겠지만 다른 프로그램이 그 파일을 읽어서 동시에 써 넣을 순 있겠죠.

만약 바꿀수 있다면, 프로그래머가 그 파일을 close하도록 코드가 작성되어 있기 때문에 가능한것으로 알고 있습니다.

위와 같은것은 윈도우나 리눅스 다 마찬가지라고 봅니다.

a287848의 이미지

리눅스에서 open 으로 파일 열고 수정 하는 도중에

다른 콘솔 여셔서 파일 한번 지워 보세요 ^^

지워 집니다.

Dig it.

camerabug의 이미지

bejoy4him님, a287848님 답변 감사합니다 ^^
그런데 아직 궁금증이 잘 풀리질 않습니다

bejoy4him님 말씀대로라면...각 어플리케이션마다 다르다는 말씀이신가요?
어떤 어플리케이션은 write 할 때마다 open해야 하고,
어떤 어플리케이션은 계속 open 상태를 유지한다는 말씀 같은데요
그렇다면...현재 열려있는 모든 파일의 리스트를 얻는 방법은 없을까요? (사실 이게 제일 궁금했었어요 ^^)

a287848님...파일 이름을 바꿀 수 있다는 것하고 close 되어있다는 것하고는 같은 의미로 받아들여도 될까요?
open되어 있지만 각 프로세스에 서로 다른 file descriptor가 할당되어서 close 상태가 아니더라도 이름을 바꿀 수 있지 않을까 해서요.

무시칸 질문 계속 드려 죄송합니다
아시는 분들 답변 달아주시면 감사히 읽겠습니다 ^^

송효진의 이미지

윈도용 에디터에서 파일 열고, 파일명을 변경하고,
에디터에서 그대로 저장하면 변경된 파일명에 저장되는게 아니고,
이전이름으로 새 파일이 생기죠.
대부분의 경우 파일이 없어졌다. 창을 유지하겠는가 를 먼저 물어보고요.

윈도 내부적으로가 아니고, 에디터가 그렇게 처리하는것 뿐이죠.
즉 c 등으로 프로그래밍 할 때 fopen() fclose() 함수에 해당하는게 아니라는거죠.

윈도든 리눅스든 에디터의 파일열기 = fopen() 이 아닙니다.
에디터에서는 훨씬 많은 처리를 합니다.

아래는 php로 간단히 작성해본 것입니다.
fopen() 함수 단위에서는 이름이 바뀌어도 바뀐 이름에 적용이 됩니다.
asdf.txt 를 생성하고 asdf 를 기록한 후 닫지 않은채
zxcv.txt 로 이름을 변경한 후 zxcv 를 기록합니다.
결과는 zxcv.txt 에 asdfzxcv 가 기록되었습니다.

<?php

$fp = fopen('asdf.txt', 'w');
fwrite($fp, 'asdf');

rename('asdf.txt', 'zxcv.txt');

fwrite($fp, 'zxcv');

fclose($fp);

?>

vi 로 :w 하고 다른 터미널로 파일명을 바꾼 후 :w 하면,
새 파일이 생성됩니다.

그리고 fopen() 된 파일 목록은 커널이 어딘가에 저장해놓았을것 같긴 한데 잘 모르겠습니다.

송효진의 이미지

윈도와 리눅스(유닉스)의 중요한 차이점이,
실행중인 파일은 윈도에서는 잠겨서 파일명변경이나 삭제가 안되는 반면,
리눅스에서는 그냥 변경되고 삭제됩니다.
그래도 실행중인 프로세스는 잘 돌아갑니다.
일단 fopen() 한 후에는 이름변경에도 아무 상관 없던것 처럼.

camerabug의 이미지

송효진님 자세한 설명 감사합니다
덕분에 잘 이해가 되었습니다 ^^

ganadist의 이미지

참고로 어떤 pid를 가진 프로세스가 열어놓은 파일을 살펴보려면 /proc/`pid`/fd 의 내용을 보시면 됩니다.

Quote:

ganadist 16678 # pwd
/proc/16678
ganadist 16678 # ls -l exe
lrwxrwxrwx 1 root root 0 7월 18 22:09 exe -> /usr/sbin/apache2
ganadist 16678 # ls -l fd
합계 13
lr-x------ 1 root root 64 7월 18 22:10 0 -> /dev/null
l-wx------ 1 root root 64 7월 18 22:10 1 -> /dev/null
l-wx------ 1 root root 64 7월 18 22:10 10 -> /var/log/apache2/ssl_access_log
l-wx------ 1 root root 64 7월 18 22:10 11 -> /var/log/apache2/ssl_request_log
l-wx------ 1 root root 64 7월 18 22:10 12 -> /var/cache/apache2/ssl_mutex.16674 (deleted)
l-wx------ 1 root root 64 7월 18 22:10 2 -> /var/log/apache2/error_log
lrwx------ 1 root root 64 7월 18 22:10 3 -> socket:[21084]
lrwx------ 1 root root 64 7월 18 22:10 4 -> socket:[21085]
lr-x------ 1 root root 64 7월 18 22:10 5 -> pipe:[21095]
l-wx------ 1 root root 64 7월 18 22:10 6 -> pipe:[21095]
l-wx------ 1 root root 64 7월 18 22:10 7 -> /var/log/apache2/error_log
l-wx------ 1 root root 64 7월 18 22:10 8 -> /var/log/apache2/ssl_error_log
l-wx------ 1 root root 64 7월 18 22:10 9 -> /var/log/apache2/access_log

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

무한포옹의 이미지

송효진 wrote:
윈도와 리눅스(유닉스)의 중요한 차이점이,
실행중인 파일은 윈도에서는 잠겨서 파일명변경이나 삭제가 안되는 반면,
리눅스에서는 그냥 변경되고 삭제됩니다.
그래도 실행중인 프로세스는 잘 돌아갑니다.
일단 fopen() 한 후에는 이름변경에도 아무 상관 없던것 처럼.

변경되는 경우도 허다합니다.

-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===

bejoy4him의 이미지

camerabug wrote:

bejoy4him님 말씀대로라면...각 어플리케이션마다 다르다는 말씀이신가요?
어떤 어플리케이션은 write 할 때마다 open해야 하고,
어떤 어플리케이션은 계속 open 상태를 유지한다는 말씀 같은데요
그렇다면...현재 열려있는 모든 파일의 리스트를 얻는 방법은 없을까요? (사실 이게 제일 궁금했었어요 ^^)

열려있는 파일의 목록을 살펴보려면 lsof 정도를 사용하면 될듯합니다. 설치되어있지 않다하더라도 쉽게 설치하여 사용할수 있습니다. 다음의 링크를 참조하세요..

http://www.ironmask.net/tools/LSOF_report.html

참고적으로 윈도우 환경이 아닌경우에는 파일을 open하였다 하더라도 파일의 이름/경로같은 정보등을 바꿀수 있다는 사실은 처음 알았습니다. 내가 너무 무심결에 넘어간것 같기도 하구요...

특이하게 생각되는게 윈도에서 메모장으로 텍스트 파일을 열고 나서 그 파일의 이름을 바꾸거나 심지어 삭제하는 것 까지도 가능한데. 그 텍스트 파일이 들어있는 폴더이름을 바꾸거나 삭제하는것은 가능하지 않습니다. 이넘의 메모장은 파일을 읽어들이고 close를 한걸까요 아니면 open 되어있는 상태일까요? 리눅스처럼 close를 안한 상태에서도 파일의 삭제및 이름 변경이 일부분에 있어서 가능한 것은 아닐까요?
(그러고 보니 처음에 윈도는 열려진 파일에 대한 이름변경및 삭제가 불가능하다라는 말을 뒤업고 있네용^^)

궁금증이 꼬리를 물지만 여하튼 여러가지를 생각하게 하고 도와주신, 글을 올리신 분들께 감사드립니다.
꼭 제가 질문자 같네용. ^^;;

camerabug의 이미지

많은 분들께서 답변해주셨네요
정말 감사드립니다 ^^
덕분에 많이 배웠습니다.

bejoy4him님...LSOF 알려주셔서 감사합니다
아직 설치해보진 않았지만, 제게 필요한 프로그램인것 같습니다

익명 사용자의 이미지

계속 open된 상태를 유지하는지,
아니면 필요한 작업을 마치고 close 한 후에
파일에 대해 write 작업이 있을 때마다
다시 open해서 사용하고 close를 하는지 궁금합니다.

아는 분께 얘기를 들으니 윈도우에서는
파일을 사용하고 있더라도 내부적으로는 close를 한 상태이고
write 할 때마다 open과 write, close를 반복한다고 하셔서요
그래서 파일을 open한 상태에서도 탐색기를 띄워
그 파일의 이름을 바꿀 수 있는거라고 그러시더라구요.
리눅스에서도 close 상태로 있는지 의문이 들었습니다.

그리고 정말로 close 되는지 아닌지를 제가 직접 확인하려면

댓글 달기

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