1

假设c.txt在目录中bunlink c.txt很简单,系统只是删除{XXX, c.txt}目录中的条目b。但是,如果b是 的子目录a,并且我想取消链接b,程序是相同的还是更复杂?

4

3 回答 3

5

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

如果要递归删除目录,则必须智能地使用这两个系统调用。您可能会发现递归删除的许多不同实现,例如这个使用nftw,或者这个使用opendir/ readdir

于 2013-03-11T09:54:37.683 回答
1

从取消链接的手册页:

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

所以在使用 unlink 时,不能将目录作为参数传递。

于 2013-03-11T09:40:16.370 回答
0

在 Linux 上,结果似乎是 EISDIR,但在 OSX 上,结果似乎是 EPERM,所以显然你不能安全地调用 unlink(),然后仅在 unlink() 失败时将其作为目录尝试。

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$
于 2019-04-03T12:14:36.980 回答