为什么某些符号链接会影响程序行为?

为什么某些符号链接会影响程序行为?

一段时间以来一直困扰我的一件事是:

% which halt
/sbin/halt
% file /sbin/halt
/sbin/halt: symbolic link to `reboot'

然而,执行sudo halt当然会不是重新启动系统。这是为什么?

例如,还有其他几个程序以这种方式工作pdflatex

答案1

每个程序都可以看到用于运行它的完整命令行(除了 shell 扩展的通配符和变量)。

在 C 程序中,命令行存储在 中argv,它是参数向量
程序的名称是 的第一个元素argv,即argv[0]

halt显然,在和的情况下reboot,程序正在根据 改变其行为argv[0]

在 bash 中,您可以看到用于使用ps -p <pid> -o cmd或运行程序的完整命令行cat /proc/<pid>/cmdline

请注意,还有另一种类型的链接称为硬链接,它具有相同的效果。例如,在我的系统上,sudosudoedit是同一个文件,但具有两个不同的名称和不同的行为。

ls -i可以帮助您找到这些命令,例如:

$ ls -il | awk '$3 != 1 { print }'
total 156872
2491111 -rwsr-xr-x 2 root   root     127560 2011-01-20 05:03 sudo
2491111 -rwsr-xr-x 2 root   root     127560 2011-01-20 05:03 sudoedit

man ln如果您不熟悉硬链接,请参阅参考资料 来了解有关硬链接的更多详细信息。

相关内容