Linux 에서 link, unlink, close, fclose 상세 설명

 
 unlink系统调用】   
    
功能描述: 
从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。 
 
用法:  
#include <unistd.h>

int unlink(const char *pathname);


参数:   
pathname:指向需解除连接的文件名。  
  
    
返回说明:   
成功执行时,返回0。失败返回-1,errno被设为以下的某个值   
EACCES:权能不足 
EFAULT: 内存空间不可访问 
EIO:发生输入输出错误
EISDIR:pathname索引的是目录
ELOOP :路径解析的过程中存在太多的符号连接 
ENAMETOOLONG:路径名超出可允许的长度 
ENOENT:路径名部分内容表示的目录不存在,或者是悬浮的连接 
ENOMEM: 核心内存不足 
ENOTDIR:路径名的部分内容不是目录 
EPERM : 文件系统不支持文件或者目录的解除连接,也有可能是权限步允许
EROFS    :文件系统只读

       
       모든 파일 은 하나의 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 작업 이 있 기 때 문 입 니 다.
      예 를 들 어 간단 한 설명: 셸 을 통 해   touch test.txt
1、stat("test.txt",&buf);
      printf("1.link=%d
",buf.st_nlink);//未打开文件之前测试链接数 2、fd=open("test.txt",O_RDONLY);//打开已存在文件test.txt stat("test.txt",&buf); printf("2.link=%d
",buf.st_nlink);//测试链接数 3、close(fd);//关闭文件test.txt stat("test.txt",&buf); printf("3.link=%d
",buf.st_nlink);//测试链接数 4、link("test.txt","test2.txt");//创建硬链接test2.txt stat("test.txt",&buf); printf("4.link=%d
",buf.st_nlink);//测试链接数 5、unlink("test2.txt");//删除test2.txt stat("test.txt",&buf); printf("5.link=%d
",buf.st_nlink);//测试链接数 6、重复步骤2 //重新打开test.txt 7、unlink("test.txt");//删除test.txt fstat(fd,&buf); printf("7.link=%d
",buf.st_nlink);//测试链接数 8、close(fd);//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。

상기 8 단 계 를 순서대로 실행 한 결 과 는 다음 과 같다.
1.link=1
    2.link=1    //open不影响链接数
    3.link=1    //close不影响链接数
    4.link=2    //link之后链接数加1
    5.link=1    //unlink后链接数减1
    2.link=1    //重新打开  链接数不变
    7.link=0    //unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过   文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。
   执行步骤8,文件内容被删除。。。。

실례 분석:
#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;

    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("temp.txt")<0){ printf("unlink error !
"); } stat("temp.txt",&buff); printf("after unlink tem.link=%d
",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; }

좋은 웹페이지 즐겨찾기