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; }

 

좋은 웹페이지 즐겨찾기