AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 36235
Accepted
KayKay
KayKay
Asked: 2011-04-22 00:45:25 +0800 CST2011-04-22 00:45:25 +0800 CST 2011-04-22 00:45:25 +0800 CST

unlik后与硬链接有什么不同的符号链接?

  • 772

1.

#include <stdio.h>
#include <unistd.h>

void main(){
    link("foo", "bar");
    unlink("foo");
    if(open("bar", 1) < 0)
        printf("open error\n");
    else
        printf("open succeeded\n");
}

2.

#include <stdio.h>
#include <unistd.h>

void main(){
    symlink("foo", "bar");
    unlink("foo");
    if(open("bar", 1) < 0)
        printf("open error\n");
    else
        printf("open succeeded\n");
}

第一个代码的结果是“打开成功”。
并且文件“foo”被删除。仅保留内容与文件“foo”相同的“bar”。

第二个代码的结果是“打开错误”。而且也只剩下“酒吧”。

为什么会产生这些结果?
1. 特别是,虽然硬链接和符号链接(“bar”)都指向文件“foo”,但文件“foo”被删除了。
2. 为什么在 unlink("foo") 之后 "bar" 没有被删除。unlink 函数意味着它删除了指向指定文件的链接。(本例为“foo”)
3. 为什么第一个代码和第二个代码的结果不同?

symbolic-link
  • 2 2 个回答
  • 820 Views

2 个回答

  • Voted
  1. James Henstridge
    2011-04-22T01:23:45+08:002011-04-22T01:23:45+08:00

    首先,您确定您以正确的方式获得了程序的输出吗?符号链接版本失败,硬链接版本成功。

    其次,将数字常量作为标志参数传递open是不可移植的,并且使您的代码难以阅读。相关标志定义在 中<fcntl.h>,而您使用的常量是O_WRONLY。

    如果将符号链接作为第一个参数传递给open,则相当于传递符号链接指向的名称。在您的示例中,符号链接指向一个不存在的文件,导致系统调用失败。如果您希望调用创建文件,则需要O_WRONLY|O_CREAT作为标志传递。这将导致文件foo被创建。

    对于硬链接情况,名称bar链接到foo的文件内容而不是名称。取消链接foo不会改变这一事实,因此会bar继续存在并且可以在没有O_CREAT.

    • 3
  2. Best Answer
    nik
    2011-04-22T00:58:46+08:002011-04-22T00:58:46+08:00

    我将从现有文章中快速参考,

    使用硬链接文件,

    删除文件时,在删除所有文件名部分之前,不会处理数据部分。inode 中有一个计数,指示有多少文件名指向该文件,每次删除这些文件名之一时,该计数减 1。当计数为零时,inode 及其关联数据将被删除。

    有关详细信息,请阅读硬链接和软链接之间的区别。

    就像,您可能对硬链接上的其他事实感兴趣,

    该计数还反映了文件已打开但未关闭的次数(换句话说,对该文件的多少引用仍处于活动状态)。这有一些起初并不明显的后果:您可以删除一个文件,以便没有“文件名”部分指向 inode,而无需释放文件数据部分的空间,因为该文件仍处于打开状态。

    你可以用你的测试代码试试。

    顺便说一句:你能重新检查你的两个案例吗?
    我认为你会得到 symlink() 案例的错误和 link() 案例的成功。
    我建议您在不同的目录中运行它们或为这两种情况使用不同的文件名:-)

    • 0

相关问题

  • 如何创建一个别名,以便当我输入“kt”时它执行“killall gnome-terminal”?

  • 如何找到菊花链符号链接的最终目标?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    我需要什么命令来解压缩/提取 .tar.gz 文件?

    • 8 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Martin Hope
    EmmyS 我需要什么命令来解压缩/提取 .tar.gz 文件? 2011-02-09 14:50:41 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve