精华内容
下载资源
问答
  • 主要介绍了Linux unlink函数和删除文件的操作方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 头文件 #include<unistd.h> 函数原型 int unlink(const char *pathname); ...pathname:指定要移除的链接文件。...失败则返回-1,同时设置errno为相应值。...执行unlink()函数并不一定会真正的删除文件,它先会检...
    • 头文件

      #include<unistd.h>
      
    • 函数原型

      int unlink(const char *pathname);
      

      pathname:指定要移除的链接文件。
      成功返回0;失败则返回-1,同时设置errno为相应值。

    • unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。

      执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1,如果不是1说明此文件还有其他链接对象,因此只对此文件的连接数进行减1操作。若连接数为1,并且在此时没有任何进程打开该文件,此内容才会真正地被删除掉。在有进程打开此文件的情况下,则暂时不会删除,直到所有打开该文件的进程都结束时文件就会被删除。

    • 删除文件
      操作系统通过把文件的inode索引号与磁盘中的block块建立了关联,这样就可以通过文件找到block块的位置,也就看到了文件的数据了。在删除文件时,是由系统的2个变量来控制的一个是i_link,表示文件的硬链接数量,另一个是i_count,表示文件的引用计数,文件删除的必需条件就是i_link = 0和i_count = 0。

      在磁盘中的文件只要把i_link = 0(硬链接数)就可以把文件删除了,如果这个文件在程序中被打开,我们还需要把运行的程序干掉 i_count = 0,这样才能达到删除文件的目的。

      i_count是当前进程打开文件的引用计数,i_link是文件链接的数量,可以把i_count理解为内存中文件的计数器,而i_link是磁盘中的计数器。对于rm命令来说实际就是设置磁盘中文件的i_link计数为0。如果一个文件被进程所使用,而用户又执行了rm命令把文件删除掉了,此时程序还能正常执行,依旧能从文件中读取正确的数据,这是因为rm命令只是把i_link设置为 0(是将文件到inode的关联断开,并没有删除掉inode与磁盘中的block数据块,此时停止进程,被删除的数据可以找回来,如果进程正在写入数据,那么磁盘的block块的数据会被进程写入的数据覆盖掉,原先的数据就恢复不了了)。

      而进程仍然在引用该文件i_count = 1,执行rm命令系统并不会真正的删除该文件,如果要删除该文件必须让进程解除对该文件的引用计数,也就是把进程干掉,这样文件才会被真正的删除掉。即便如此,文件真的被删除了吗?前面我们说过文件的数据是存储在磁盘上block块中,当我们要查找文件当中的数据时并不是直接找到磁盘上的block块,因为磁盘上的block块实在是太多了,你怎么就知道你的数据存储在哪个block块中?

      假设你一不小心把非常重要的数据删除掉了,这将意味着你的数据就永远也找不回来了,从而造成无法挽回的损失了,由此可见数据的重要性,因此操作系统不会轻易把数据从磁盘中真正的删除掉。

      看到这里,相信你已经明白了,实际上你所谓的右键删除操作只是把文件的inode索引号与磁盘中的block的关联断开了而已,但文件的数据并没有真正的被删除掉。如果你想真的删除数据的话,要么把磁盘格式化,要么把原先的数据删除掉,然后写入新的数据覆盖掉,当然,你也可以选择格式化和数据覆盖双重保险,这个时候你的数据想要恢复基本上是非常困难的,即便可以顶多只能恢复一部分数据了吧。

      我们删除文件,从某种意义上说,只是让文件具备了被释放的条件,至于什么时候释放这取决于操作系统。如果你真的一不小心删除了很重要的数据的话,这个时候赶紧恢复数据,其他的任何多余的操作尽量不要做,这样在数据恢复过程中才能尽量减少数据丢失。

    • unlink原理
      unlink函数删除文件时,只是把i_link链接计数减1,而进程的i_count计数还是1,并没有断开与文件的关联关系,因此进程可以调用write函数往文件里面写数据,自然也就能成功了。当程序运行结束后,调用close关闭对文件的引用,此时文件就会被操作系统删除掉。

    展开全文
  • int unlink(const char *pathname); #include <fcntl.h> /* Definition of AT_* constants */ #include <unistd.h> int unlinkat(int dirfd, const char *pathname, int flags); 二、实例 2.1 基本...

    一、函数声明

    #include <unistd.h>
    
    int unlink(const char *pathname);
    
    #include <fcntl.h>           /* Definition of AT_* constants */
    #include <unistd.h>
    
    int unlinkat(int dirfd, const char *pathname, int flags);
    
    #include <stdio.h>
    
    int remove(const char *pathname);
    

    1.1 函数各功能简述

    • unlink 只可以删除文件。
    • unlinkat 可以删除文件(默认)或文件夹(需要设置flags为AT_REMOVEDIR)。
    • remove 可以删除文件,或者文件夹。【可以认为remove底层是unlinkat一样的实现,只不过不需要针对是文件夹时,指定参数AT_REMOVEDIR】

    二、实例

    2.1 基本使用(删除文件,与目录)

    2.1.1 unlink (结果,文件删除成功,无法删除目录)
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **args)
    {
        if (unlink("test") < 0) {
            perror("unlink file test with fail");
            exit(-1);
        }
    
        return 0;
    }
    
    hotice0@ubuntu:~/Documents/Unix_Program$ touch test
    hotice0@ubuntu:~/Documents/Unix_Program$ ./unlink_unlinkat 
    hotice0@ubuntu:~/Documents/Unix_Program$ ll test
    ls: cannot access 'test': No such file or directory
    hotice0@ubuntu:~/Documents/Unix_Program$ mkdir test
    hotice0@ubuntu:~/Documents/Unix_Program$ ./unlink_unlinkat 
    unlink file test with fail: Is a directory
    
    2.1.2 跟踪rm -r (其使用的是unlinkat系统调用)

    跟踪命令strace rm -r test,结果如下

    ...
    unlinkat(AT_FDCWD, "test", AT_REMOVEDIR) = 0
    ...
    
    2.1.3 unlinkat (带AT_REMOVEDIR时,能删除文件夹,不带时能删除文件)
    #define __USE_ATFILE
    
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main(int argc, char **args)
    {
        if (unlinkat(AT_FDCWD, "test", AT_REMOVEDIR) < 0) {
            perror("unlinkat file test with fail");
            exit(-1);
        }
        return 0;
    }
    
    hotice0@ubuntu:~/Documents/Unix_Program$ mkdir test
    hotice0@ubuntu:~/Documents/Unix_Program$ ./unlink_unlinkat 
    hotice0@ubuntu:~/Documents/Unix_Program$ touch test
    hotice0@ubuntu:~/Documents/Unix_Program$ ./unlink_unlinkat 
    unlinkat file test with fail: Not a directory
    
    2.1.4 remove(可以删除文件,或者文件夹)
    // 简单的实例
    #include <stdio.h>
    
    int main(int argc, char **args)
    {
        remove("test");
        return 0;
    }
    

    2.2 创建临时文件

    即,首先通过open打开并创建文件,随后调用unlink减少文件计数。但是由于该文件被程序打开,所以文件不会被立即删除,而是进程退出时,内核会判断没有其他进程打开该文件,并且文件链接数为0,才会真正的删除文件。

    下面是用于验证的程序

    #define __USE_ATFILE
    
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUF_SIZE 1024
    
    int main(int argc, char **args)
    {
        int fd;
        char buf[BUF_SIZE] = {0};
        
        fd = open("test", O_CREAT|O_RDWR, S_IRWXU);
        if (fd < 0) {
            perror("open with fail");
            exit(-1);
        }
        printf("file created\n");
        sleep(5);
        if (unlink("test") < 0) {
            perror("unlink file test with fail");
            close(fd);
            exit(-1);
        }
    
        printf("unlinked\n");
        sleep(5);
    
        if (write(fd, "hotice0", strlen("hotice0")) < 0) {
            perror("write with fail");
            close(fd);
            exit(-1);
        }
    
        if (lseek(fd, 0, SEEK_SET) < 0) {
            perror("lseek with fail");
            close(fd);
            exit(-1);
        }
    
        if (read(fd, buf, BUF_SIZE) < 0) {
            perror("read with fail");
            close(fd);
            exit(-1);
        }
    
        printf("read from file test: %s\n", buf);
    
        close(fd);
        printf("closed file\n");
    
        return 0;
    }
    

    这个程序很简答,首先创建test文件,然后sleep5s,再调用unlink删除该文件,再sleep5s,再向文件写入,内容并且读出,然后close文件。

    2.2.1运行结果
    // A terminal
    ./unlink_unlinkat
    file created
    unlinked
    read from file test: hotice0
    closed file
    
    // B terminal
    hotice0@ubuntu:~/Documents/Unix_Program$ ll test    // 这一步是在open test文件之后,文件就存在了
    -rwx------ 1 hotice0 hotice0 0 Aug  8 00:34 test*
    hotice0@ubuntu:~/Documents/Unix_Program$ ll test     // 这一步是在unlink调用之后,文件在该目录中无法找到了
    ls: cannot access 'test': No such file or directory
    

    三、总结

    1. unlink 默认,只能删除文件的链接。
    2. unlinkat可以通过flag参数,是否是AT_REMOVEDIR,控制删除文件还是文件夹。
      (所以可以通过open打开文件后,通过stat获取文件类型,根据类型决定是否使用AT_REMOVEDIR)

    通过stat获取文件类型的例子可以看我的博客:Linux stat获取文件类型

    1. remove函数作用其实和unlink和unlinkat作用是一样的,但是可以删除文件和文件夹,不需要指定类型(是文件还是文件夹)。
    展开全文
  • Linux unlink()

    2016-06-20 16:23:15
    函数说明:unlink()会删除参数pathname 指定的文件. 如果该文件名为最后连接点, 但有其他进程打开了此文件, 则在所有关于此文件的文件描述词皆关闭后才会删除. 如果参数pathname 为一符号连接, 则此连
    相关函数:link, rename, remove
    

    头文件:#include <unistd.h>

    定义函数:int unlink(const char * pathname);

    函数说明:unlink()会删除参数pathname 指定的文件. 如果该文件名为最后连接点, 但有其他进程打开了此文件, 则在所有关于此文件的文件描述词皆关闭后才会删除. 如果参数pathname 为一符号连接, 则此连接会被删除。

    返回值:成功则返回0, 失败返回-1, 错误原因存于errno

    错误代码:
    1、EROFS 文件存在于只读文件系统内。
    2、EFAULT 参数pathname 指针超出可存取内存空间。
    3、ENAMETOOLONG 参数pathname 太长。
    4、ENOMEM 核心内存不足。
    5、ELOOP 参数pathname 有过多符号连接问题。
    6、EIO I/O 存取错误。
    展开全文
  • 两者都是同一基本函数的包装器,它是一个unlink()系统调用.权衡用户土地利用率之间的差异.RM(1):>更多选择.>更多反馈.>理智检查.>由于上述原因,单个呼叫的速度会慢一些.>可以同时使用多个参数调用.(1...

    两者都是同一基本函数的包装器,它是一个unlink()系统调用.

    权衡用户土地利用率之间的差异.

    RM(1):

    >更多选择.

    >更多反馈.

    >理智检查.

    >由于上述原因,单个呼叫的速度会慢一些.

    >可以同时使用多个参数调用.

    (1)取消关联:

    >减少健全性检查.

    >无法删除目录.

    >无法递归.

    >一次只能拿一个参数.

    >由于它的简单性,在单个呼叫方面更加精简.

    >与给出rm(1)多个参数相比,速度较慢.

    您可以通过以下方式证明其差异

    $touch $(seq 1 100)

    $unlink $(seq 1 100)

    unlink: extra operand `2'

    $touch $(seq 1 100)

    $time rm $(seq 1 100)

    real 0m0.048s

    user 0m0.004s

    sys 0m0.008s

    $touch $(seq 1 100)

    $time for i in $(seq 1 100); do rm $i; done

    real 0m0.207s

    user 0m0.044s

    sys 0m0.112s

    $touch $(seq 1 100)

    $time for i in $(seq 1 100); do unlink $i; done

    real 0m0.167s

    user 0m0.048s

    sys 0m0.120s

    但是,如果我们正在谈论对系统unlink(2)函数的纯粹调用,我现在意识到这可能不是你所考虑的.

    您可以对目录和文件执行系统unlink().但是如果目录是其他目录和文件的父目录,那么将删除指向该父目录的链接,但是这些子目录将被悬空.这不太理想.

    编辑:

    对不起,澄清了unlink(1)和unlink(2)之间的区别.平台之间的语义仍然不同.

    展开全文
  • linux unlink() access() mkfifo()使用实例

    千次阅读 2014-06-11 17:21:20
    函数原型:int unlink( const char * pathname ); 所属库:stdio.h 函数功能:删除一个文件的目录项并减少它的链接数,若成功则返回0,否则返回-1,错误原因存于errno。如果想通过调用这个函数来成功删除文件...
  • 1. unlink函数对于硬链接来说,unlink 用来删除目录项,并把 inode 引用计数减 1,这两步也是一个原子过程。直到 inode 引用计数为 0,才会真正删除文件。对于软链接来说,unlink 直接删除软链接,而不影响软链接...
  • linux-unlink

    2019-07-01 11:13:05
    Linuxunlink函数的使用一、头文件 #include<unistd.h> 二、函数原型int unlink(const char *pathname); 三、函数介绍unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 注意: ...
  • Linuxunlink

    2019-07-15 10:40:13
    unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1,如果不是1说明 此文件还有其他链接对象,...
  • Linux C unlink函数

    2021-03-17 20:45:54
    函数说明:unlink()会删除参数pathname 指定的文件. 如果该文件名为最后连接点, 但有其他进程打开了此文件, 则在所有关于此文件的文件描述词皆关闭后才会删除. 如果参数pathname 为一符号连接, 则此连接会被删除。 ...
  • linuxunlink函数解析

    千次阅读 2013-08-04 11:17:10
    [lingyun@localhost unlink]$ cat unlink.c  /*********************************************************************************  * Copyright: (C) 2013 fulinux   * All rights res
  • Linuxunlink函数的使用

    万次阅读 2018-11-05 14:57:07
    一、头文件 #include&lt;unistd.h&gt; 二、函数原型 ...int unlink(const char *pathname);... 执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1,如果不是...
  • linuxunlink函数的使用

    万次阅读 多人点赞 2013-01-18 14:20:04
    linux中有句话很实用,“有问题找男人”,这就是man的作用,man里面共有7个章节,这次经过学习,把对unlink的学习经验分享出来。 在linux下有很多很实用的函数,但对于一个具体的linux函数,我们在使用它的时候...
  • linuxunlink的使用

    千次阅读 2017-05-06 17:13:02
     13 unlink("temp.txt");//删除临时的文件temp  14 write(fd,"我爱你哦!!!",50);//向当前的文件写入字符  15 lseek(fd,0,SEEK_SET);//重置指针的指向  16 char buff[1024];//定于一个缓存的数组  17...
  • linux学习-unlink

    2011-09-30 21:51:36
    unlink系统调用: 功能描述:  从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。  用法:  #include int unlink(const char *...
  • Linux指令--unlink

    2017-12-19 09:45:00
    unlinkunlink - 调用unlink函数删除指定的文件 这个函数和rm的用法几乎一模一样,唯一不一样的就是,它没有那么多的OPTION。 --help display this help and exit --version output version information and exit ...
  • 每天回顾linux命令(unlink

    万次阅读 2017-11-06 15:13:06
    unlink命令 unlink命令用于系统调用函数unlink去删除指定的文件。和rm命令作用一样。语法 unlink FILEFILE 要删除的文件。eg:root@68fc0a9bc6dd:/home/wzm/testuniq# ls testfile.txt root@68fc0a9bc6dd:/home/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,495
精华内容 8,598
关键字:

linuxunlink

linux 订阅