2010-01-11 3 views
8

두 개의 파일 이름을 인수로 허용하는 프로그램이 있습니다. 두 번째 파일을 만들기 위해 첫 번째 파일을 읽습니다. 프로그램이 첫 번째 파일을 덮어 쓰지 않도록하려면 어떻게합니까?두 파일 이름이 동일한 실제 파일을 가리키는 지 확인하는 방법

제한 :

  • (소프트 또는 하드) 파일 시스템에서 지원하는
  • 파일 권한을 고정하고 첫 번째 파일을 읽고 두 번째 파일입니다 필요가있다 링크 할 때 작업을 계속해야하는 방법
  • 그것은 바람직 플랫폼 중립적이어야 행해지고
+8

UNIX 및 Linux 철학에서 이러한 프로그램을 필터라고합니다. 일반적으로 표준 입력 (STDIN)을 읽고 표준 출력 (STDOUT)에 씁니다. 이렇게하면 호출자에게 그러한 검증의 책임을 맡기는 프로그램 작성이 쉬워집니다. 귀하의 프로그램은 그 일을하는데 집중할 수 있습니다. –

답변

12

리눅스에서 두 파일을 열고 st_ino (편집 :)과 st_dev이 같은지 확인하려면 fstat을 사용하십시오. open은 기호 링크를 따릅니다. 경쟁 조건을 방지하기 위해 stat을 직접 사용하지 마십시오.

+4

경쟁 조건은 파일 상태가 stat (2)와 open (2) 사이에서 변경 될 수 있음을 의미합니다. stat을 수행하면 일부 사용자는 방금 언급 한 파일의 연결을 해제하고 두 번째 파일을 방금 열려고하는 파일에 연결합니다 (2). 그냥 설명해. –

+7

또한'st_dev' 필드가 일치하는지 확인하십시오. 두 개의 다른 볼륨에있는 서로 다른 파일이 동일한 inode 번호를 갖는 것을 막을 수있는 방법은 없습니다. –

3

가능한 경우, 첫 번째 파일을 열고 (리눅스 기본 목표이지만) 읽기 전용 (,436,127,)을 리눅스에서 사용합니다. 그런 다음 다시 열어 쓰기를 시도하면 오류가 발생합니다.

+0

두 번째 파일이 이미 다른 프로세스에서 읽기 전용으로 열려 있으면 오 탐지됩니다. 필자는 보편적 인 해결책이 가능한지 확신하지 못합니다 (파일 ID를 얻는 것과 같은 파일 시스템 고유의 기능에 의존해야합니다). – Costique

9

가장 좋은 방법은 파일 이름을 ID로 사용하지 않는 것입니다. 대신 파일을 읽기 위해 열 때 OS가 지원하는 메커니즘을 사용하여 잠급니다. 또한 파일을 쓰기 위해 열면 잠금도됩니다. 잠금이 실패하면 오류를보고하십시오.

+0

매우 unixy는 아니지만 대부분의 플랫폼에서 작동하는 좋은 메타 로직 – dmckee

0

stat을 사용하여 파일 상태를 확인하고 inode 수가 동일한 지 확인할 수 있습니다.

-1

아마도 일부 쉘 명령을 호출하기 위해 system() 함수를 사용할 수 있습니까?

배쉬에서, 당신은 단순히 부를 것이다 :

stat -c %i filename 

는이 파일의 아이 노드 번호를 표시합니다. 이 방법으로 두 개의 파일을 비교할 수 있으며, inode가 동일한 경우 하드 링크임을 의미합니다. 다음 전화 번호는

으로 표시되며 파일 이름이 표시되며 심볼 링크 인 경우 링크 된 파일 이름도 인쇄됩니다. 하나의 파일 이름이 가리키는 파일이 하드 링크를 가지고 있어도 하나의 이름 만 출력하므로 심볼 링크를 확인하려면 두 번째 파일의 아이 노드 번호와 심볼 링크가 링크 된 파일을 비교해야합니다.

통계 출력을 텍스트 파일로 리디렉션 한 다음 프로그램에서 파일을 구문 분석 할 수 있습니다.

+1

내 downvote가 아니지만 데이터를 텍스트로 변환 한 다음 텍스트를 구문 분석하는 명령을 실행하는 경우는 거의 없습니다. 유닉스 시스템에서 man 페이지의 SEE ALSO 섹션은 일반적으로 커맨드 라인 유틸리티가 자신의 작업을 수행하기 위해 어떤 기능을 호출하는지 알려줍니다. 이 경우'man 1 stat'은 man 페이지를'fstat (2) '와 공유하는'lstat (2)'와'stat (2)'에 대해 알려주므로 최적의 대답을 쉽게 얻을 수 있습니다. – dmckee

+0

일반적으로 system()을 호출하는 것은 나쁜 일 (tm)입니다. 가능성이 있다고 제안했는데, 그것이 차선책이라고 생각합니다. – mingos

관련 문제