[Linux] [C 언어] 파일 디스크립터와 하드 링크의 관계에 대하여

5576 단어 C리눅스
C 언어로 파일을 읽고 쓸 때는 파일을 가리키는 파일 디스크립터라는 정수 값을 사용합니다. 프로세스가 파일을 열 때 하드 링크를 변경하거나 삭제하려고 시도했지만 프로세스는 영향을받지 않았습니다. 이 점에서, 파일 디스크립터는 하드 링크에 묶는 것이 아니라, 파일의 실체와 묶여 있다고 생각됩니다. 이미지는 이런 느낌이 듭니다.



검증 내용은 다음과 같습니다.

검증 환경



컴파일러: gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
OS: Ubuntu 20.04.2 LTS (Focal Fossa)

하드 링크 변경



파일 디스크립터가 엔터티와 연결되면 하드 링크를 변경해도 프로그램이 영향을받지 않아야합니다. 작성한 프로그램은 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define FILE_PATH "A.txt"

int
main(void)
{
  int f = open(FILE_PATH, O_WRONLY);
  if (f < 0) {
    perror("");
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "open file %s\n", FILE_PATH);

  sleep(10);

  char *buf = "HELLO!";
  if (write(f, buf, sizeof buf) < 0) {
    perror("");
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "write file %s\n", FILE_PATH);

  if (close(f) < 0) {
    perror("");
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "close file %s\n", FILE_PATH);

  exit(EXIT_SUCCESS);
}

이 프로그램은 파일을 연 후 10초 동안 기다린 다음 HELLO! 를 쓰고 파일을 닫습니다. 그 사이에 mv 명령으로 파일의 하드 링크를 변경해 봅니다. 알기 쉽게 하기 위해, 쉘의 조작은 줄머리에 $ 를 붙였습니다.
$ ./open_close &
[1] 30887
open file A.txt
$ mv A.txt B.txt
write file A.txt
close file A.txt
mv 명령으로 하드 링크를 B.txt 변경했지만 변경된 파일에 올바르게 기록되었습니다.
$ cat B.txt
HELLO!

이 결과로부터, 단지 하드 링크가 변경된 것만으로, 프로그램이 사용하고 있는 파일 디스크립터는 영향을 받지 않는 것을 알 수 있습니다.

하드 링크 삭제



그런 다음 하드 링을 삭제해보십시오. 파일 디스크립터가 엔터티와 연결되면 하드 링크를 삭제해도 영향을받지 않아야합니다.

이전과 동일한 프로그램을 사용하여 파일이 열려있는 동안 rm 명령으로 하드 링크를 삭제해보십시오.
$ ./open_close &
[1] 30949
open file A.txt
$ rm A.txt
write file A.txt
close file A.txt

파일이 삭제되었으므로 프로그램 종료 후에도 존재하지 않습니다.
$ ls A.txt
ls: 'A.txt' にアクセスできません: そのようなファイルやディレクトリはありません

이 결과로부터도, 하드 링크가 삭제되었을 뿐이므로, 실체를 가리키고 있던 파일 디스크립터는 영향을 받지 않습니다.

참고문헌



서적 : 보통 리눅스 프로그래밍 제 2 판 아오키 미네로 저

좋은 웹페이지 즐겨찾기