linux path. 太长了,在Linux中,符号链接的值是否可以长于PATH_MAX?

正如幼儿园的每个孩子都知道的那样,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

标签:filesystems,linux

来源: https://codeday.me/bug/20190623/1269360.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值