열린 파일이 다른 프로그램에 의해 이동될 때 프로그램이 해당 파일에 대한 작업을 계속할 수 있습니까? [복사]

열린 파일이 다른 프로그램에 의해 이동될 때 프로그램이 해당 파일에 대한 작업을 계속할 수 있습니까? [복사]

한 프로그램이 파일을 열고 다른 프로그램이 다른 경로/파일 이름을 갖도록 파일을 이동하면,할 수 있는첫 번째 프로그램은 파일의 내용이나 속성을 수정하고 변경 사항을 파일에 저장하는 등 파일에 대한 작업을 계속 수행합니까?

그런 것 같아요.

  • 파일이 이동되면 경로 이름/파일 이름은 다르지만 여전히 동일한 inode와 데이터 블록을 갖습니다.

  • 프로그램이 파일을 열 때 파일의 경로명/파일 이름은 해당 inode와 데이터 블록을 찾는 데 사용되며, 프로그램은 파일의 inode와 데이터 블록의 데이터 구조에 대한 포인터를 직간접적으로 저장합니다. 조회 후에도 경로 이름/파일 이름이 여전히 유용한지 확실하지 않습니다.

대답이 '예'라면 어떤 행동이예상되는fromprograms, 그런 프로그램을 만들고 싶다고 가정해 볼까요?

  • 이동된 파일을 자동으로 처리할지 여부,
  • 사용자에게 이동 사실을 알리고 이동된 파일에 대한 작업을 계속할지 물어봐야 합니까?

나는 종종 파일을 가능한 한 오랫동안 일부 프로그램(emacs, 일부 pdf 소프트웨어)에 열어 두는데, mv다른 프로그램(emacs, 일부 pdf 소프트웨어)을 사용하여 동시에 특정 시점에 파일을 이동하거나 이름을 바꿀 수 있을 만큼 충분히 오래 유지합니다. Emacs에서 파일이 이동되었다고 경고하는데, Emacs에서 이동된 파일을 계속해서 처리할 수 있을지 모르기 때문에 보통 버퍼를 닫고 이동한 파일을 새 버퍼에 다시 열어야 하는데 이게 불편한 것 같아요 .

감사해요.

답변1

열린 파일은 Linux 시스템에서 어떻게 작동합니까?일부 관련 배경이 제공됩니다.

할 수 있는첫 번째 프로그램은 파일의 내용이나 속성을 수정하고 변경 사항을 파일에 저장하는 등 파일에 대한 작업을 계속 수행합니까?

첫 번째 프로그램이 파일 설명자를 열어 두는 한 해당 파일 설명자를 사용하는 시스템 호출이나 라이브러리 함수를 사용하여 파일을 계속 변경할 수 있습니다. 파일이 동일한 파일 시스템의 다른 디렉터리로 이동되면 변경 사항이 "새" 파일에 적용됩니다. 다른 파일 시스템으로 이동하면 다른 디렉터리 항목이 동일한 inode를 가리키지 않으면 변경 사항이 결국 손실됩니다. .

파일이 이동되면 경로 이름/파일 이름은 다르지만 여전히 동일한 inode와 데이터 블록을 갖습니다.

동일한 파일 시스템 내에서 이동했다면 그렇습니다.

프로그램이 파일을 열 때 파일의 경로명/파일 이름은 해당 inode와 데이터 블록을 찾는 데 사용되며, 프로그램은 파일의 inode와 데이터 블록의 데이터 구조에 대한 포인터를 직간접적으로 저장합니다. 조회 후에도 경로 이름/파일 이름이 여전히 유용한지 확실하지 않습니다.

예, 커널의 도움으로 프로그램에는 커널이 유지 관리하는 파일 설명을 가리키는 파일 설명자가 있습니다. 파일 이름은 중요하지 않습니다.

대답이 '예'라면 어떤 행동이예상되는fromprograms, 그런 프로그램을 만들고 싶다고 가정해 볼까요?

아무것도 아니다예상되는. 일부 프로그램은 파일에 대한 업데이트 쓰기를 포함하여 파일 작업 중에 파일을 열고 반환된 파일 설명자를 유지합니다. 다른 사람들은 파일을 열고 반환된 파일 설명자를 유지하지만 Emacs를 포함하여 파일에 쓰기 위해 더 복잡한 쓰기-이름 바꾸기 모드를 사용합니다. Emacs는 또한 열려 있는 파일의 외부 변경 사항을 모니터링하고 그러한 변경 사항에 대해 경고합니다.

결국 그들은당신의파일을 사용하여 수행하는 작업을 추적하는 것은 사용자에게 달려 있습니다. 일부 프로그램은 데이터 손실을 방지하기 위해 많은 노력을 기울이는 반면 다른 프로그램은 그렇지 않습니다.

답변2

첫 번째 프로그램이 파일의 내용이나 속성을 수정하고 변경 사항을 파일에 저장하는 등 파일을 계속 처리할 수 있습니까?

예.

파일이 이동되면 경로 이름/파일 이름은 다르지만 여전히 동일한 inode와 데이터 블록을 갖습니다.

예.

프로그램이 파일을 열 때 파일의 경로명/파일 이름은 해당 inode와 데이터 블록을 찾는 데 사용되며, 프로그램은 파일의 inode와 데이터 블록의 데이터 구조에 대한 포인터를 직간접적으로 저장합니다.

예. 파일을 삭제하면 효과는 거의 동일하지만 이 경우 수정 사항을 저장하기가 어렵습니다.

조회 후에도 경로 이름/파일 이름이 여전히 유용한지 확실하지 않습니다.

무슨 뜻인지 잘 모르겠습니다. 나는 그것이 유용하다고 생각하는 것에 달려 있다고 생각합니다. 동일한 경로 조회를 다시 수행하면 여기의 경우처럼 다른 파일을 얻을 수 있습니다.

Emacs는 편집하는 동안 파일이 수정되었는지 여부를 사용자에게 알려주는 것이 유용할 수 있습니다. 이를 감지하려면 경로를 폴링하거나 사용하는 inotify등 의 작업을 수행해야 합니다 . 다른 편집자들은 신경 쓰지 않습니다.

나는 여기에 "필수"가 있다고 생각하지 않습니다. 다양한 프로그램이 작성자가 유용하다고 생각하는 작업을 수행할 것입니다.

FWIW, 편집자들은 백업 파일을 처리하는 방법과 파일의 새 버전을 새 inode로 생성하는지 아니면 이전 버전을 덮어쓰는지 여부가 다르다는 생각이 들었습니다. Emacs는 다음과 같이 구성될 수 있습니다...

답변3

프로그램에서 예상되는 동작

프로그램은 열린 파일의 이름이 변경되었다는 자동 알림을 받지 못한다는 점을 이해하는 데 도움이 될 수 있습니다. 짐작할 수 있듯이 이동 후에도 파일은 변경되지 않습니다. 이것은 변하지 않았습니다.목차보유 명칭이 변경되었습니다. 이는 이유목차파일 권한이 아닌 권한이 파일 삭제(또는 생성) 가능 여부를 제어합니다.

프로그램은 디렉토리가 수정될 때 알림을 받기 위해 다양한 기술을 사용할 수 있습니다. 그러나 대부분의 사람들은 이를 수행하지 않으므로 "예상되는" 동작은 침묵입니다.

답변4

프로그램이 파일을 열 때 파일의 경로 이름/파일 이름은 해당 inode와 데이터 블록을 찾는 데 사용됩니다.

그러나 프로그램은 inode가 아닌 파일 설명자만 가져옵니다. inode는 파일 시스템에서 내부적으로 사용됩니다.

vim이 나에게 이렇게 말했습니다. 심지어 빨간색 오류이기도 합니다.

E211: File "test" no longer available

내가 그냥이름 바꾸기그것은 - 이동하여. 이 개념에는 이름 변경이 없습니다. 파일은 많은 내용을 담고 있지만 실용적인 목적을 위한 기본 단위입니다. :w어차피 그랬을 것처럼 다시 할 수 있었지만 실수였습니다 .

게다가:

W11: Warning: File "test" has changed since editing started

그냥 만족해요.

vi침묵이 있는 것 같았습니다.

관련 정보