这是我被问到的面试问题。
假设您有一个大型脚本文件,用于编译和清理。还假设您在此文件的同一目录中有名为folder
的文件夹。此外,在此文件的末尾,您有以下代码行:
clean:
rm -r -f folder &
当您尝试清理项目时,假设它正常工作。但是,如果我们删除&符并写下:
clean:
rm -r -f folder
然后在您尝试清理之后,您将收到以下错误:
rm: cannot remove 'folder': Directory not empty
但如果您再次尝试清洁,则会根据需要清除文件夹。
我需要找到所有可能的原因,这怎么可能发生。我唯一能想到的是,如果我们在运行这个脚本的几个线程之间有一些竞争。然后我被问到 - "如果只有一个线程运行代码怎么办?"
我没有看到这个问题怎么会在一个线程中发生 - 但似乎我错了,我不知道为什么。 还有哪些其他情况会导致上述错误?
编辑:在采访中,我还可以假设以下内容:
(1)。脚本文件中的其他位置没有&符号,但是我写的rm
代码行
(2)。执行rm
folder
中不会创建新文件
答案 0 :(得分:1)
我很高兴这是一个虚构的问题。在makefile中使用&
这种方式完全是假的;希望没有人在现实世界中这样做。
无论如何,在典型的采访场景中,你需要猜测采访者在他们的剧本中的答案。至少在您的问题中,问题的描述可能是错误的(如果在采访中也出现了错误的情况,那也不会是不寻常的)。如果错误消息出现在&
存在且您运行make clean all
,则该问题具有一定的理论意义。然后,新构建会创建阻止删除目录的文件。这就是为什么你不应该在makefile配方中使用&
。
答案 1 :(得分:0)
AFAIK,在shell中,当进程在后台运行时,无法获取进程的状态。这个过程可能无止境地进行 - 可能需要几个小时。只有前台进程会给你退出代码。因此,make
永远无法检查带符号的任何命令的状态。请检查以下内容:
% true
% ls /non-exist-file &
% echo $?
答案 2 :(得分:0)
我只能假设这个问题的一个原因:它们在Mac OS X上并且在HFS +中遇到了一个旧的错误,其中readdir()
系统调用在某些情况下产生了错误的结果。他们只是想知道你是否了解它(见:https://www.postgresql.org/message-id/51549ea20911051659j62a3959ct8b2f2e702953cf83@mail.gmail.com)
rm
来电推向后台以避免make
获得有关失败的知识并不是一个解决方法。在-
之前添加一行会产生相同的结果,同时避免可能的竞争条件。