假设c.txt
位于目录b
中。 unlink c.txt
很简单,系统只删除目录{XXX, c.txt}
中的条目b
。但是,如果b
是a
的子目录,并且我想取消链接b
,会发生相同或更复杂的过程会发生什么?
答案 0 :(得分:4)
unlink(2)
只能删除文件,而rmdir(2)
只能删除空目录。
如果要以递归方式删除目录,则必须智能地使用这两个系统调用。您可能会发现许多不同的递归删除实现,例如this one正在使用nftw
,或this one正在使用opendir
/ readdir
。
答案 1 :(得分:1)
从手册页取消链接:
When the utility is called as unlink, only one argument,
which must not be a directory, may be supplied.
因此,当使用unlink时,您无法将目录作为参数传递。
答案 2 :(得分:0)
在Linux上,结果似乎是EISDIR,但是在OSX上,结果似乎是EPERM,因此,显然,您不能安全地对某些对象调用unlink(),然后仅当unlink()失败时才尝试将其作为目录使用。 / p>
dickbutt:~/unlink$ uname -a
Linux dickbutt 4.14.69-0-vanilla #1-Alpine SMP Mon Sep 10 19:33:23 UTC 2018 x86_64 Linux
dickbutt:~/unlink$ 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));
}
dickbutt:~/unlink$ mkdir xxx
dickbutt:~/unlink$ gcc ./unlink.c
dickbutt:~/unlink$ ./a.out
ret is [-1] and errno is [21] aka [Is a directory]
dickbutt:~/unlink$
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$