在Linux中,符号链接的值是否可以长于PATH_MAX?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Linux中,符号链接的值是否可以长于PATH_MAX?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2256字,纯文字阅读大概需要4分钟。
内容图文
![在Linux中,符号链接的值是否可以长于PATH_MAX?](/upload/InfoBanner/zyjiaocheng/967/5f130a2495594d2c8d42790d1918dc75.jpg)
正如幼儿园的每个孩子都知道的那样,Linux中的文件路径不能长于PATH_MAX字符.
但是试验我的系统,命令
ln -s $(for i in {0..1024}; do printf dir/../; done)foobar foobar1
失败,错误消息文件名太长.
我不太明白为什么.这里没有长文件名,只是文件foobar1的预期内容很长.甚至还没有人试图遍历符号链接的内容以达到目标.当然我可以有一个内容比PATH_MAX大得多的文件.
另一方面,命令如
for i in {0..4096}; do ln -s $i $(expr $i + 1); done
成功.只有当我试图遍历链条时,系统才会抱怨.
但我对穿越任何东西都不感兴趣.我正在编写必须读取符号链接值的软件(没有遍历),我想知道我是否需要考虑很长的值.
Linux中哪些文档记录不允许这样做?或者它依赖于文件系统实现并且可以改变吗?
解决方法:
对符号链接的调用失败了
ENAMETOOLONG (File name too long)
这来自内核.它也是依赖于文件系统的,因此无法在任何地方找到SYMLINK_MAX.例如…
XFS
if (pathlen < 0 || pathlen > MAXPATHLEN) {
xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)",
__func__, (unsigned long long) ip->i_ino,
.......
}
和MAXPATHLEN == 1024
ReiserFS文件系统
item_len = ROUND_UP(strlen(symname));
if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) {
retval = -ENAMETOOLONG;
.......
}
EXT2
struct super_block * sb = dir->i_sb;
int err = -ENAMETOOLONG;
unsigned l = strlen(symname)+1;
.....
if (l > sb->s_blocksize)
goto out;
....
return err;
符号链接应该可以在文件名的任何地方使用,因此它的逻辑意义是它小于PATH_MAX,重要的不是它里面的内容.来自Linux上的符号链接手册页.
ENAMETOOLONG
target or linkpath was too long.
这很模糊,因为文件系统定义了它.您可以达到的另一个限制是_POSIX_SYMLINK_MAX.
#define _POSIX_SYMLINK_MAX 255
要测试它,请在目录中创建以下两个链接.这个会成功的
ln -s foo Fh5LNDZYm2vUlf3jypJtAaX1ElqHZAF4ivsuq8sHyKVLDrYi4zR3T2QcXwS5TPRTys9aUxuh3qtnlNnFQGInmLiM7GK1xpN78ZbcD4JWizfPa7VWwhR4XWpvaJLHCIONUTC6A8fjNVfhv434vWckuKDzTacno0LE13mBVHuj5RDgJIkmW1zUcMMh5E38VisPxSN7BGxBVXHtn0cUPmZLmYSzGrOJqEJzimvwh2uDi8uXEOwBLbsfYlxBOz1kw8P
这个会失败
ln -s foo Fh5LNDZYm2vUlf3jypJtAaX1ElqHZAF4ivsuq8sHyKVLDrYi4zR3T2QcXwS5TPRTys9aUxuh3qtnlNnFQGInmLiM7GK1xpN78ZbcD4JWizfPa7VWwhR4XWpvaJLHCIONUTC6A8fjNVfhv434vWckuKDzTacno0LE13mBVHuj5RDgJIkmW1zUcMMh5E38VisPxSN7BGxBVXHtn0cUPmZLmYSzGrOJqEJzimvwh2uDi8uXEOwBLbsfYlxBOz1kw8Pk
一个是255个字符长,另一个是256.在您的问题中,此命令将起作用,因为每个链接都有自己的inode,名称很短.
for i in {0..4096}; do ln -s $i $(expr $i + 1); done
内容总结
以上是互联网集市为您收集整理的在Linux中,符号链接的值是否可以长于PATH_MAX?全部内容,希望文章能够帮你解决在Linux中,符号链接的值是否可以长于PATH_MAX?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。