[Linux] [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 판 아오키 미네로 저
Reference
이 문제에 관하여([Linux] [C 언어] 파일 디스크립터와 하드 링크의 관계에 대하여), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/BooookStore/items/f20d9c53606e4114703a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
파일 디스크립터가 엔터티와 연결되면 하드 링크를 변경해도 프로그램이 영향을받지 않아야합니다. 작성한 프로그램은 다음과 같습니다.
#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 판 아오키 미네로 저
Reference
이 문제에 관하여([Linux] [C 언어] 파일 디스크립터와 하드 링크의 관계에 대하여), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/BooookStore/items/f20d9c53606e4114703a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ ./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 판 아오키 미네로 저
Reference
이 문제에 관하여([Linux] [C 언어] 파일 디스크립터와 하드 링크의 관계에 대하여), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/BooookStore/items/f20d9c53606e4114703a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)