unlink和close关系

今天看到nginx用文件锁实现互斥的实现方案时,发现,unlink文件后还可需用fd,很是纳闷!于是搜索到此文,并自测了下,涨姿势了~分享给大家~

原理:

  每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。
      当通过shell的touch命令或者在程序中open一个带有O_CREAT的不存在的文件时,文件的链接数为1。

通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,即open之后返回fd,调用进程可以通过fd来read 、write 、 ftruncate等等一系列对文件的操作。
      close()就是消除这种调用进程与文件之间的访问关系。自然,不会影响文件的链接数。在调用close时,内核会检查打开该文件的进程数,如果此数为0,进一步检查文件的链接数,如果这个数也为0,那么就删除文件内容。

link函数创建一个新目录项,并且增加一个链接数。
      unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在unlilnk之前没有close,那么依旧可以访问文件内容。
  
      综上所诉,真正影响链接数的操作是link、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!\n");
    }
    stat("temp.txt",&buff);
    printf("temp.link=%d\n",buff.st_nlink);

    link("temp.txt","test.txt");
    stat("test.txt",&buff);
    printf("after link the tem.link =%d\n",buff.st_nlink);

    if(unlink("test.txt")<0){
        printf("unlink error !\n");
    }
    stat("temp.txt",&buff);
    printf("after unlink tem.link=%d\n",buff.st_nlink);

    if(unlink("temp.txt")<0){
        printf("unlink error !\n");
    }
    //此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过文件名访问    //但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息
    fstat(fd,&buff);
    printf("after unlink tem.link=%u\n",buff.st_nlink);

    if(write(fd,"temp",5)<0){
        printf("write wrror!\n");
    }
    if((lseek(fd,0,SEEK_SET))==-1){
        printf("lseek error!\n");
    }
    if((read(fd,buf,5))<0){
        printf("read error!\n");
    }
    printf("%s\n",buf);
    return 0;
}
时间: 2024-11-12 17:34:50

unlink和close关系的相关文章

【http】http的方法,状态码和组成部分

Http(Hypertext Transfer Protocol) HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议.它可以使浏览器更加高效,使网络传输减少.它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等. 用于http协议交互的信息被称为http报文.请求端(客户端)的http报文叫做请求报文,响应端(服务器)的叫做响应报文. 请求报文由请

http协议及httpd-2.2基本功能实现

HTTP,即:HyperText Transfer Protocol的简称,超文本传输协议.1960年美国人泰德·尼尔森构思了一种通过计算机处理文本信息的方法,并称之为超文本(Hypertext),这成为了HTTP标准架构的发展根基.1990年,为了方便分布于世界各地的高能物理学家之间的协作,欧洲粒子物理研究所(European Organization for Nuclear Research,简称CERN)的计算机科学家蒂姆·伯纳斯·李以及与之一同工作的罗伯特·卡里奥,提出了一个基于"超文本

HTTP请求方法对照表

根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法. HTTP Request Method共计15种 序号 方法 描述 1 GET 请求指定的页面信息,并返回实体主体. 2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 3 POST 向指定资源提交数据进行处理请求(例如提交

《HTTP图解》阅读笔记

HTTP基础的简单理解 在了解HTTP协议之前,我们先了解下TCP/IP的参考模型,TCP/IP参考模型分为四层:应用层.传输层.网络层.链路层(数据链路层). 应用层:为不同的网络应用提供所需的服务. 传输层:为应用层实体提供端到端的通信/传输功能,确保数据包的按顺序传送及数据的完整性. 网络层:处理网络上流动的数据包,它所包含的协议涉及到数据包在整个网络上的逻辑传输. 链路层:监控数据交换,处理网络连接的硬件部分. TCP/IP通信传输流如下图所示: HTTP在各层的封装处理: 与HTTP协

前端面试个人总结

# 面试题总结 ### 基础部分 1. 什么是HTML? 答: - [ ] > ?      HTML并不是真正的的程序语言,他是一种 标 记 语 言 ,用来结构化和含义化你想要放 > 在web 网站上的那些内容.它由一系列的元素(elements)所组成,这些元素可以用来 > 封装你的内容中担任不同工作的各部分和各个角色. 2. 什么是CSS? 答: - [ ] > ?      就像 HTML,CSS 也不是真正的编程语言.它是样式表语言,也就是说,它允许你有 > 选择性

ResfulApi规范

序号 方法 描述 1 GET 请求指定的页面信息,并返回实体主体. 2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的建立和/或已有资源的修改. 4 PUT 从客户端向服务器传送的数据取代指定的文档的内容. 5 DELETE 请求服务器删除指定的页面. 6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器. 7

【深入HTTP协议】-- 1565075570.4519832

目录 HTTP 请求 HTTP 响应 原创链接: http://106.13.73.98/__/80/ HTTP是(Hyper Text Transfer Protocol)超文本传输协议的缩写. HTTP的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC. RFC 1945定义了HTTP/1.0版本,其中最著名的就是RFC 261

【深入HTTP协议】 -- 2019-08-08 20:39:57

目录 HTTP 请求 HTTP 响应 原文: http://106.13.73.98/__/80/ HTTP是(Hyper Text Transfer Protocol)超文本传输协议的缩写. HTTP的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC. RFC 1945定义了HTTP/1.0版本,其中最著名的就是RFC 2616,

【深入HTTP协议】 -- 2019-08-09 12:11:34

目录 HTTP 请求 HTTP 响应 原文: http://106.13.73.98/__/80/ HTTP是(Hyper Text Transfer Protocol)超文本传输协议的缩写. HTTP的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC. RFC 1945定义了HTTP/1.0版本,其中最著名的就是RFC 2616,