Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 取消目录链接时会发生什么情况?_Linux_Unlink_Rmdir - Fatal编程技术网

Linux 取消目录链接时会发生什么情况?

Linux 取消目录链接时会发生什么情况?,linux,unlink,rmdir,Linux,Unlink,Rmdir,假设c.txt位于目录b中取消c.txt的链接很容易,系统只需删除目录b中的条目{XXX,c.txt}。但是,如果b是a的子目录,并且我想取消b的链接,那么会发生什么情况?取消链接的过程是相同的还是更复杂?来自手册页: When the utility is called as unlink, only one argument, which must not be a directory, may be supplied. 因此,在使用取消链接时,不能将目录作为参数传递。从取消链接的手

假设
c.txt
位于目录
b
取消c.txt的链接很容易,系统只需删除目录
b
中的条目
{XXX,c.txt}
。但是,如果
b
a
的子目录,并且我想取消
b
的链接,那么会发生什么情况?取消链接的过程是相同的还是更复杂?

来自手册页:

When the utility is called as unlink, only one argument, 
which must not be a directory, may be supplied.  

因此,在使用取消链接时,不能将目录作为参数传递。

从取消链接的手册页:

When the utility is called as unlink, only one argument, 
which must not be a directory, may be supplied.  
因此,当使用unlink时,您不能将目录作为参数传递。

unlink(2)
只能删除文件,而
rmdir(2)
只能删除空目录

如果要递归删除目录,则必须智能地使用这两个系统调用。您可能会发现递归删除的许多不同实现,例如使用
nftw
,或者使用
opendir
/
readdir
取消链接(2)
只能删除文件,而
rmdir(2)
只能删除空目录


如果要递归删除目录,则必须智能地使用这两个系统调用。您可能会发现许多不同的递归删除实现,例如使用
nftw
,或者使用
opendir
/
readdir
在Linux上,结果似乎是EISDIR,但在OSX上,结果似乎是EPERM,因此显然您无法安全地调用unlink()仅当unlink()失败时,才尝试将其作为目录

dickbutt:~/unlink$uname-a
Linux dickbutt 4.14.69-0-vanilla#1-Alpine SMP周一9月10日19:33:23 UTC 2018 x86_64 Linux
dickbutt:~/unlink$cat./unlink.c
#包括
#包括
#包括
#包括
int main(){
int ret=取消链接(“./xxx”);
printf(“ret是[%d],errno是[%d]又称[%s]\n”),ret,errno,
斯特雷罗(埃尔诺));
}
dickbutt:~/unlink$mkdir xxx
dickbutt:~/unlink$gcc./unlink.c
dickbutt:~/unlink$./a.out
ret是[-1],errno是[21]aka[是一个目录]
dickbutt:~/取消链接$
notgay:unlink user$uname-a
Darwin notgay.local 14.5.0 Darwin内核版本14.5.0:Sun Jun 4 21:40:08 PDT 2017;根目录:xnu-2782.70.3~1/RELEASE_X86_64 X86_64
notgay:取消链接用户$cat./unlink.c
#包括
#包括
#包括
#包括
int main(){
int ret=取消链接(“./xxx”);
printf(“ret为[%d],errno为[%d]又称[%s]\n”,ret、errno、strerror(errno));
}
notgay:取消用户$mkdir xxx的链接
notgay:取消链接用户$gcc./unlink.c
notgay:取消用户$/a.out的链接
ret为[-1],errno为[1]aka[不允许操作]
notgay:取消用户链接$

在Linux上,结果似乎是EISDIR,但在OSX上,结果似乎是EPERM,因此显然您无法安全地对某个对象调用unlink(),然后仅在unlink()失败时将其作为目录进行尝试

dickbutt:~/unlink$uname-a
Linux dickbutt 4.14.69-0-vanilla#1-Alpine SMP周一9月10日19:33:23 UTC 2018 x86_64 Linux
dickbutt:~/unlink$cat./unlink.c
#包括
#包括
#包括
#包括
int main(){
int ret=取消链接(“./xxx”);
printf(“ret是[%d],errno是[%d]又称[%s]\n”),ret,errno,
斯特雷罗(埃尔诺));
}
dickbutt:~/unlink$mkdir xxx
dickbutt:~/unlink$gcc./unlink.c
dickbutt:~/unlink$./a.out
ret是[-1],errno是[21]aka[是一个目录]
dickbutt:~/取消链接$
notgay:unlink user$uname-a
Darwin notgay.local 14.5.0 Darwin内核版本14.5.0:Sun Jun 4 21:40:08 PDT 2017;根目录:xnu-2782.70.3~1/RELEASE_X86_64 X86_64
notgay:取消链接用户$cat./unlink.c
#包括
#包括
#包括
#包括
int main(){
int ret=取消链接(“./xxx”);
printf(“ret为[%d],errno为[%d]又称[%s]\n”,ret、errno、strerror(errno));
}
notgay:取消用户$mkdir xxx的链接
notgay:取消链接用户$gcc./unlink.c
notgay:取消用户$/a.out的链接
ret为[-1],errno为[1]aka[不允许操作]
notgay:取消用户链接$

假设我们有“a/b/c”,还有另一个“d/e”,其中e是c的硬链接,如果我们删除目录a及其子目录,那么e指向哪里,无效?我参考了计算机系统设计的
原则
,在这种情况下,e作为一个悬空引用,不会造成中断。@stonestrong如果它是一个/symbol/link,它最终将作为一个悬空引用,但是/hardlink/将导致该文件的使用计数仍然为1,因此该文件仍然存在。您可以自己尝试:
mkdir-p a/b;回声你好,世界\!>a/b/c;mkd;ln-s../a/b/c d/e;在a/b/c和d/f中;rm-rfa;d/e类;cat d/f
假设我们有“a/b/c”,还有另一个“d/e”,其中e是c的硬链接,如果我们删除目录a及其子目录,那么e指向哪里,无效?在这种情况下,我参考了《计算机系统设计原理》
,e最终作为一个不中断的悬挂引用。@stonestrong如果它是/symbol/link,它最终将作为一个悬挂引用,但是/hardlink/将导致文件的使用计数仍然为1,因此该文件仍然存在。您可以自己尝试:
mkdir-p a/b;回声你好,世界\!>a/b/c;mkd;ln-s../a/b/c d/e;在a/b/c和d/f中;rm-rfa;d/e类;cat d/f
当谈到为什么Unix文件系统只允许链接到文件而不允许链接到目录时,
计算机系统设计原则
给出了一个取消目录链接的示例,请参见第100页。如果这个例子不合适,还有更好的解释吗?当谈到为什么Unix文件系统只允许链接到文件,而不允许链接到目录时,
计算机系统设计原则
给出一个取消目录链接的例子,见第100页。如果这个例子不合适,有没有更好的解释?
notgay:unlink user$ uname -a
Darwin notgay.local 14.5.0 Darwin Kernel Version 14.5.0: Sun Jun  4 21:40:08 PDT 2017; root:xnu-2782.70.3~1/RELEASE_X86_64 x86_64
notgay:unlink user$ cat ./unlink.c
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main() {
    int ret = unlink("./xxx");
    printf("ret is [%d] and errno is [%d] aka [%s]\n", ret, errno, strerror(errno));
}
notgay:unlink user$ mkdir xxx
notgay:unlink user$ gcc ./unlink.c
notgay:unlink user$ ./a.out
ret is [-1] and errno is [1] aka [Operation not permitted]
notgay:unlink user$