linux不可用于文件名的符号,linux – 是否可以在文件名中使用“/”?

答案是,你不能,除非你的文件系统有一个错误。这里是为什么:

有一个系统调用来重命名在fs / namei.c中定义的文件,名为renameat:

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,

int, newdfd, const char __user *, newname)

当系统调用被调用时,它对名称进行路径查找(do_path_lookup)。继续跟踪这个,我们得到link_path_walk这有:

static int link_path_walk(const char *name, struct nameidata *nd)

{

struct path next;

int err;

unsigned int lookup_flags = nd->flags;

while (*name=='/')

name++;

if (!*name)

return 0;

...

此代码适用于任何文件系统。这是什么意思?这意味着如果你尝试使用传统方法传递一个带有实际“/”字符作为文件名的参数,它将不会做你想要的。没有办法逃脱的性格。如果文件系统“支持”这一点,那是因为它们:

>使用unicode字符或看起来像斜杠但不是。

>他们有一个错误。

此外,如果您进入并编辑字节以将斜杠字符添加到文件名中,则会发生错误。这是因为你永远不可能通过名称引用这个文件:(因为任何时候你做的,Linux会假设你指的是一个不存在的目录。使用’rm *’技术不会工作,因为bash只是扩展到文件名。即使rm -rf也不会工作,因为一个简单的strace揭示了事情在罩下(缩短):

$ ls testdir

myfile2 out

$ strace -vf rm -rf testdir

...

unlinkat(3, "myfile2", 0) = 0

unlinkat(3, "out", 0) = 0

fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)

close(3) = 0

unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0

...

请注意,对unlinkat的这些调用将失败,因为他们需要按名称引用这些文件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值