如果您有一个大文件要unlink(2),内核不会解锁 inode,直到所有块指针都返回到空闲块列表。您可以通过创建第二个链接来检查时间差异(这将使取消链接仅释放您正在删除的链接,而不释放任何块)。根据规范,释放所有这些块的代码是您的进程(好吧,在内核模式下运行,而不是用户模式,但没有保留进程将块返回到空闲列表)并且在释放所有块之前它不会返回。
示例:(编辑)
以下代码将说明这一点:
#include <errno.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define D(X) "%s:%d:%s: " X, __FILE__, __LINE__, __func__
int main(int argc, char **argv)
{
int opt, i;
while ((opt = getopt(argc, argv, "")) != EOF) {
switch (opt) {
} /* switch */
} /* while */
argc -= optind; argv += optind;
for (i = 0; i < argc; i++) {
struct timespec now, then;
int res;
res = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &now);
if (res < 0) {
fprintf(stderr,
D("ERROR: %s (errno = %d)\n"),
strerror(errno), errno);
exit(EXIT_FAILURE);
} /* if */
unlink(argv[i]);
res = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &then);
if (res < 0) {
fprintf(stderr, D("ERROR: %s (errno = %d)\n"),
strerror(errno), errno);
exit(EXIT_FAILURE);
} /* if */
then.tv_nsec -= now.tv_nsec;
then.tv_sec -= now.tv_sec;
if (then.tv_nsec < 0) {
then.tv_nsec += 1000000000L;
then.tv_sec--;
} /* if */
printf(D("%s: %d.%09d s. (CPU time)\n"),
argv[i], then.tv_sec, then.tv_nsec);
} /* for */
exit(EXIT_SUCCESS);
} /* main */
然后我用这个命令构造一个 2Gb 的文件:
$ yes | dd of=pepe bs=1M iflag=fullblock count=2048
然后我创建了 32 个指向该文件的链接:
i=0
while [ "$i" -lt 32 ]
do ln pepe pepe$i
i=$(expr $i + 1)
done
然后我运行以下命令(仅显示 CPU 时间):
$ unlink pepe[0-9]* pepe
unlink.c:47:main: pepe0: 0.000074272 s. (CPU time)
unlink.c:47:main: pepe1: 0.000022722 s. (CPU time)
unlink.c:47:main: pepe10: 0.000015034 s. (CPU time)
unlink.c:47:main: pepe11: 0.000013254 s. (CPU time)
unlink.c:47:main: pepe12: 0.000012827 s. (CPU time)
unlink.c:47:main: pepe13: 0.000012462 s. (CPU time)
unlink.c:47:main: pepe14: 0.000012241 s. (CPU time)
unlink.c:47:main: pepe15: 0.000012753 s. (CPU time)
unlink.c:47:main: pepe16: 0.000012517 s. (CPU time)
unlink.c:47:main: pepe17: 0.000012245 s. (CPU time)
unlink.c:47:main: pepe18: 0.000013104 s. (CPU time)
unlink.c:47:main: pepe19: 0.000012491 s. (CPU time)
unlink.c:47:main: pepe2: 0.000012662 s. (CPU time)
unlink.c:47:main: pepe20: 0.000012606 s. (CPU time)
unlink.c:47:main: pepe21: 0.000012803 s. (CPU time)
unlink.c:47:main: pepe22: 0.000012597 s. (CPU time)
unlink.c:47:main: pepe23: 0.000012391 s. (CPU time)
unlink.c:47:main: pepe24: 0.000012582 s. (CPU time)
unlink.c:47:main: pepe25: 0.000012557 s. (CPU time)
unlink.c:47:main: pepe26: 0.000012386 s. (CPU time)
unlink.c:47:main: pepe27: 0.000012261 s. (CPU time)
unlink.c:47:main: pepe28: 0.000012245 s. (CPU time)
unlink.c:47:main: pepe29: 0.000012351 s. (CPU time)
unlink.c:47:main: pepe3: 0.000011940 s. (CPU time)
unlink.c:47:main: pepe30: 0.000013003 s. (CPU time)
unlink.c:47:main: pepe31: 0.000012231 s. (CPU time)
unlink.c:47:main: pepe4: 0.000012777 s. (CPU time)
unlink.c:47:main: pepe5: 0.000012546 s. (CPU time)
unlink.c:47:main: pepe6: 0.000012461 s. (CPU time)
unlink.c:47:main: pepe7: 0.000013129 s. (CPU time)
unlink.c:47:main: pepe8: 0.000012311 s. (CPU time)
unlink.c:47:main: pepe9: 0.000012446 s. (CPU time)
unlink.c:47:main: pepe: 0.195457587 s. (CPU time)
如您所见,除最后一个链接外,所有链接都需要大约 12 微秒,但最后一个链接几乎是十分之二秒的执行时间。