symlink在ln的过程中究竟占用了多少耗时

本文通过strace工具详细分析了使用ln命令和symlink命令进行文件链接时的系统调用流程和耗时情况,揭示了两者之间的性能差异,并深入探讨了导致差异的主要原因,重点关注于中断、IO操作等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看到群里的童鞋们在讨论ln命令的使用,天花乱坠说到了symlink,有同学用估算的口气说symlink耗时很低的,肯定ln总耗时是symlink的好几百倍,他猜中了吗?

现在针对ln -s ~/install install来验证下strace -tt -T输出:

14:08:20.190334 execve("/bin/ln", ["ln", "-s", "/home/linxp/install", "install"], ["XDG_VTNR=7", "SSH_AGENT_PID=2251", "XDG_SESSION_ID=c2", "CLUTTER_IM_MODULE=xim", "SESSION=ubuntu", "TERM=xterm", "XDG_MENU_PREFIX=gnome-", "SHELL=/bin/bash", "VTE_VERSION=3406", "WINDOWID=65011719", "UPSTART_SESSION=unix:abstract=/c"..., "GNOME_KEYRING_CONTROL=/run/user/"..., "GTK_MODULES=overlay-scrollbar:un"..., "USER=linxp", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "XDG_SESSION_PATH=/org/freedeskto"..., "XDG_SEAT_PATH=/org/freedesktop/D"..., "SSH_AUTH_SOCK=/run/user/1000/key"..., "SESSION_MANAGER=local/ubuntu:@/t"..., "DEFAULTS_PATH=/usr/share/gconf/u"..., "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubu"..., "PATH=/usr/lib/lightdm/lightdm:/u"..., "DESKTOP_SESSION=ubuntu", "JOB=dbus", "PWD=/tmp", "XMODIFIERS=@im=fcitx", "GNOME_KEYRING_PID=2190", "LANG=en_US.UTF-8", "GDM_LANG=en_US", "MANDATORY_PATH=/usr/share/gconf/"..., "UBUNTU_MENUPROXY=1", "IM_CONFIG_PHASE=1", "COMPIZ_CONFIG_PROFILE=ubuntu", "GDMSESSION=ubuntu", "SESSIONTYPE=gnome-session", "SHLVL=1", "XDG_SEAT=seat0", "HOME=/home/linxp", "LANGUAGE=en_US", "GNOME_DESKTOP_SESSION_ID=this-is"..., "UPSTART_INSTANCE=", "UPSTART_EVENTS=started xsession", "LOGNAME=linxp", "COMPIZ_BIN_PATH=/usr/bin/", "QT4_IM_MODULE=fcitx", "XDG_DATA_DIRS=/usr/share/ubuntu:"..., "DBUS_SESSION_BUS_ADDRESS=unix:ab"..., "LESSOPEN=| /usr/bin/lesspipe %s", "INSTANCE=", "UPSTART_JOB=gnome-session", "TEXTDOMAIN=im-config", "XDG_RUNTIME_DIR=/run/user/1000", "DISPLAY=:0", "XDG_CURRENT_DESKTOP=Unity", "GTK_IM_MODULE=fcitx", "LESSCLOSE=/usr/bin/lesspipe %s %"..., "TEXTDOMAINDIR=/usr/share/locale/", "COLORTERM=gnome-terminal", "XAUTHORITY=/home/linxp/.Xauthori"..., "_=/usr/bin/strace", "OLDPWD=/home/linxp/test"]) = 0 <0.000402>
14:08:20.192273 brk(0)                  = 0x954a000 <0.000022>
... ...
14:08:20.239693 symlink("/home/linxp/install", "install/install") = -1 EEXIST (File exists) <0.000032>
... ...
14:08:20.243516 close(2)                = 0 <0.000021>
14:08:20.243626 exit_group(1)           = ?
14:08:20.243825 +++ exited with 1 +++

总微秒耗时 T = 243825 - 190334 =>  0.053491

symlink耗时 t = 0.000032

可见symlink耗时之低,那主要的操作耗时在哪里呢:(-tt -v -c)

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         3           read
  0.00    0.000000           0         4           write
  0.00    0.000000           0        13         8 open
  0.00    0.000000           0         8           close
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         3         3 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1         1 symlink
  0.00    0.000000           0         2           munmap
  0.00    0.000000           0         3           mprotect
  0.00    0.000000           0         1         1 _llseek
  0.00    0.000000           0        10           mmap2
  0.00    0.000000           0         1           stat64
  0.00    0.000000           0         5           fstat64
  0.00    0.000000           0         1           set_thread_area
------ ----------- ----------- --------- --------- ----------------

主要都还是在中断、io操作上多操作多耗时居!

### Linux 中 `ln` 命令的功能与作用 在 Linux 系统中,`ln` 是一个非常重要的命令,主要用于创建文件之间的链接。这种链接类似于 Windows 下的快捷方式,但在 Unix/Linux 环境中有更强大的功能和灵活性。 #### 链接的两种类型 Linux 系统支持两种类型的链接: 1. **硬链接 (Hard Link)** 硬链接是指向同一 inode 的多个文件名。这意味着即使删除原始文件,只要还有一个硬链接存在,数据就不会丢失。硬链接有以下特点: - 创建硬链接时不会改变原文件的内容或权限。 - 删除源文件后,通过硬链接仍然可以访问文件内容。 - 硬链接无法跨越不同文件系统[^3]。 2. **软链接 (Symbolic Link 或 Symlink)** 软链接是一个指向另一个文件或目录的特殊文件。如果源文件被移动或删除,则软链接会失效(称为悬空链接)。软链接的特点如下: - 可以跨文件系统创建。 - 如果目标文件不存在,软链接依然有效但不可用。 - 使用 `-s` 参数来创建软链接[^1]。 #### 基本语法 `ln` 命令的基本语法为: ```bash ln [选项] 源文件 目标文件 ``` 其中常用参数包括: - `-s`: 创建软链接。这是最常见的用途之一[^4]。 - `-f`: 强制覆盖已存在的目标文件或链接。 - `-v`: 显示详细的处理过程。 #### 应用场景举例 以下是几个常见的使用案例: 1. **创建软链接** 当希望在一个新位置快速访问某个文件而不复制它时,可以使用软链接。例如: ```bash sudo ln -s /path/to/source/file /path/to/link/location ``` 2. **创建硬链接** 若需要在同一文件系统的不同路径下共享同一个文件的数据而无需额外存储开销,可使用硬链接。例如: ```bash ln /path/to/existing_file /path/to/new_hard_link ``` 3. **对目录创建软链接** 对于整个目录也可以创建软链接以便轻松导航至特定位置。例如: ```bash ln -s /var/log /home/user/logs ``` 4. **强制替换现有链接** 若要更新已有链接的目标地址,可用 `-f` 参数强行替代旧链接。例如: ```bash ln -sf new_target existing_symlink ``` #### 总结 `ln` 命令的主要目的是减少冗余并优化资源利用,在不增加实际磁盘占用的情况下实现文件间高效关联。无论是开发环境配置还是日常运维操作,掌握此工具都能极大提升工作效率[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值