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的结构体来获得文件信息,其中一个成员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操作。

      举个例子简单说明:通过shell   touch test.txt

1、stat("test.txt",&buf);printf("1.link=%d\n",buf.st_nlink);//未打开文件之前测试链接数2、fd=open("test.txt",O_RDONLY);//打开已存在文件test.txtstat("test.txt",&buf);printf("2.link=%d\n",buf.st_nlink);//测试链接数3、close(fd);//关闭文件test.txtstat("test.txt",&buf);printf("3.link=%d\n",buf.st_nlink);//测试链接数4、link("test.txt","test2.txt");//创建硬链接test2.txtstat("test.txt",&buf);printf("4.link=%d\n",buf.st_nlink);//测试链接数5、unlink("test2.txt");//删除test2.txtstat("test.txt",&buf);printf("5.link=%d\n",buf.st_nlink);//测试链接数6、重复步骤2  //重新打开test.txt7、unlink("test.txt");//删除test.txtfstat(fd,&buf);printf("7.link=%d\n",buf.st_nlink);//测试链接数8、close(fd);//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。

顺次执行以上8个步骤,结果如下:

1.link=12.link=1    //open不影响链接数3.link=1    //close不影响链接数4.link=2    //link之后链接数加15.link=1    //unlink后链接数减12.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!\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("temp.txt")<0){printf("unlink error !\n");}stat("temp.txt",&buff);printf("after unlink tem.link=%d\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;
}

Linux中link,unlink,close,fclose详解相关推荐

  1. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  2. Linux中/proc目录下文件详解(二)

    Linux中/proc目录下文件详解(二) /proc/mdstat文件 这个文件包含了由md设备驱动程序控制的RAID设备信息. 示例: [root@localhost ~]# cat /proc/ ...

  3. 转:linux中fork()函数详解

    转:linux中fork()函数详解 https://blog.csdn.net/jason314/article/details/5640969 转载于:https://www.cnblogs.co ...

  4. linux基础配置脚本,Linux中selinux基础配置教程详解

    selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系统. 三种模式: Enforcing:强制模式,在selin ...

  5. linux中useradd命令的使用详解

    今天小编给大家分享的是linux中useradd命令的使用详解,相信很多人都不太了解,为了让大家更加了解linux中useradd命令的使用详解,所以给大家总结了以下内容,一起往下看吧.一定会有所收获 ...

  6. Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件

    http://blog.chinaunix.net/uid-10449864-id-2956854.html 原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息, ...

  7. linux在当前目录下创建pic目录,Linux中/proc目录下文件详解

    文章转自: Linux中/proc目录下文件详解(一) ------------------------------------------------------------------------ ...

  8. linux中iptables配置文件及命令详解详解

    linux中iptables配置文件及命令详解详解 2018年05月04日 14:23:41 hxpjava1 阅读数 956 linux中iptables配置文件及命令详解详解 iptables配置 ...

  9. Linux中/proc目录下文件详解(zt)

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  10. linux PS -df,linux中ps跟df命令详解

    linux中ps和df命令详解 linux下PS命令 linux上进程有5种状态: 1.运行(正在运行或在运行队列中等待) 2.中断(休眠中,受阻,在等待某个条件的形成或接受到信号) 3.不可中断(收 ...

最新文章

  1. PHP获取页面执行时间的方法
  2. 机器学里面的一些概念-召回率,精确度等的介绍
  3. 百度云获取外链直接下载突破限速
  4. 在react中使用svg的各种骚姿势
  5. python web生产环境_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
  6. php wiki搭建,wiki网站搭建
  7. WLS_Oracle Weblogic服务器生命周期(案例)
  8. 如何增加Android模拟器的可用空间
  9. codevs 1164 统计数字
  10. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_3 mybatis连接池的分类
  11. Golang1.71.3下载以及安装(Linux Mac Windows)
  12. 如何批量导入文件夹,批量重命名
  13. 猜拳小游戏java_java 猜拳小游戏
  14. 小鹿爬虫系列——静态网站页面爬取
  15. 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)
  16. 计算墨水污染的格子【非常规墨水污染】
  17. python做学生管理系统数据库模型_数据库建模:学生信息系统搭建实验
  18. Linux sed实战
  19. fuse文件系统调试环境
  20. 类属性,实例属性,私有属性,类方法,实例方法,静态方法,私有方法,魔法方法

热门文章

  1. Spring Boot处理静态资源(自定义资源映射)
  2. 谢尔排序/缩减增量排序(C++)
  3. JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点
  4. Ansible中文手册
  5. Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7) 【转】...
  6. SimplifiedHibernate:简化了的Hibernate
  7. SpringMVC 项目中 Quartz 定时任务的设置纪要
  8. 获取AD里面指定OU或Container里面的计算机以及Lastlogon时间格式转换
  9. 伟世盾安助国电高级培训中心实现一网双管
  10. centos输入正确的账号和密码登陆不进去