unlink 와 close 관계
7309 단어 close
오늘 nginx 가 파일 잠 금 으로 서로 배척 하 는 실현 방안 을 보 았 을 때, unlink 파일 을 사용 한 후에 fd 를 사용 할 수 있다 는 것 을 발견 하 였 습 니 다. 매우 궁금 합 니 다!그 러 자 이 글 을 검색 해 자체 측정 해 자 세 를 올 렸 습 니 다 ~ 공유 해 드 리 겠 습 니 다 ~
원리:
모든 파일 은 하나의 struct stat 구조 체 를 통 해 파일 정 보 를 얻 을 수 있 습 니 다. 그 중의 한 구성원 stnlink 는 파일 의 링크 수 를 대표 합 니 다. 셸 의 touch 명령 이나 프로그램 에서 open 을 통 해 O 가 있 을 때CREAT 가 존재 하지 않 는 파일 일 때 파일 의 링크 수 는 1 입 니 다. 일반적으로 open 에 존재 하 는 파일 은 파일 의 링크 수 에 영향 을 주지 않 습 니 다.open 의 역할 은 호출 프로 세 스 와 파일 사이 에 접근 관 계 를 만 드 는 것 입 니 다. 즉, open 후 fd 로 돌아 갑 니 다. 호출 프로 세 스 는 fd 를 통 해 read, write, ftruncate 등 일련의 파일 작업 을 할 수 있 습 니 다. close () 는 이러한 호출 프로 세 스 와 파일 간 의 접근 관 계 를 없 애 는 것 입 니 다.자 연 스 럽 게 파일 의 링크 수 에 영향 을 주지 않 습 니 다.close 를 호출 할 때 커 널 은 이 파일 을 여 는 프로 세 스 수 를 검사 합 니 다. 이 수가 0 이면 파일 의 링크 수 를 더 검사 합 니 다. 이 숫자 도 0 이면 파일 내용 을 삭제 합 니 다. 링크 함수 가 새 디 렉 터 리 항목 을 만 들 고 링크 수 를 추가 합 니 다. unlink 함수 가 디 렉 터 리 항목 을 삭제 하고 링크 수 를 줄 입 니 다.링크 수가 0 이 되 고 프로 세 스 가 이 파일 을 열지 않 으 면 이 파일 의 내용 이 진정 으로 삭 제 됩 니 다.unlink 이전에 close 가 없 으 면 파일 내용 에 접근 할 수 있 습 니 다. 요약 하면 링크 수 에 영향 을 주 는 작업 은 링크, unlink, open 의 생 성 입 니 다. 파일 내용 을 삭제 하 는 진정한 의 미 는 파일 의 링크 수가 0 이 고 이 작업 의 본질 적 인 완성 자 는 unlink 입 니 다.
close 는 파일 내용 을 삭제 하 는 작업 을 할 수 있 습 니 다. close 전에 unlink 작업 이 있 기 때 문 입 니 다.
인증:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int fd;
char buf[32];
struct stat buff;
struct stat buff2;
if((fd=open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU))<0){
printf("create file error!
");
}
stat("temp.txt",&buff);
printf("temp.link=%d
",buff.st_nlink);
link("temp.txt","test.txt");
stat("test.txt",&buff);
printf("after link the tem.link =%d
",buff.st_nlink);
if(unlink("test.txt")<0){
printf("unlink error !
");
}
stat("temp.txt",&buff);
printf("after unlink tem.link=%d
",buff.st_nlink);
if(unlink("temp.txt")<0){
printf("unlink error !
");
}
//此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过文件名访问
//但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息
fstat(fd,&buff);
printf("after unlink tem.link=%u
",buff.st_nlink);
if(write(fd,"temp",5)<0){
printf("write wrror!
");
}
if((lseek(fd,0,SEEK_SET))==-1){
printf("lseek error!
");
}
if((read(fd,buf,5))<0){
printf("read error!
");
}
printf("%s
",buf);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
linger close 용법우아 하 게 끊 고 강제로 끊 는 두 가지 방식 이 있 습 니 다. 그러면 연결 을 끊 는 방식 을 어떻게 설정 합 니까?socket 설명 자 를 설정 하여 linger 구조 체 속성 을 설정 합 니 다. close...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.