core(5) 的联机帮助页说不生成核心转储文件的原因之一是:
与用于核心转储的名称相同的(可写、常规)文件已存在,但指向该文件的硬链接不只一个。
如果现有的同名文件是可写的,是不是就意味着它可以被覆盖?
硬链接的数量对于生成核心转储文件有何影响?
在下面的示例中,我创建了一个没有任何其他硬链接的文件core
,它不会被 coredump 覆盖:
$ ls
$ touch core
$ ls -l
total 0
-rw-rw-r-- 1 t t 0 Dec 3 06:01 core
$ # wait for a minute
$ bash -c "ulimit -c -S; ulimit -S -c 1024; ulimit -c -S; sleep 10"
0
1024
^\bash: line 1: 4071 Quit (core dumped) sleep 10
$ ls -l
total 0
-rw-rw-r-- 1 t t 0 Dec 3 06:01 core
一般来说,在不涉及核心转储的情况下,拥有多个硬链接并不能防止覆盖,所以我不确定当涉及核心转储时“但该文件有多个硬链接”意味着什么(我来这里是为了澄清而不是为了混淆别人):
$ ls
test
$ ln test testhl
$ ls -la
total 28
drwxrwxr-x 4 t t 4096 Dec 2 11:29 .
drwxrwxr-x 6 t t 4096 Dec 2 07:49 ..
-rw-rw-r-- 2 t t 4 Nov 26 10:21 test
-rw-rw-r-- 2 t t 4 Nov 26 10:21 testhl
$ echo hello > testhl
$ ls -la
total 28
drwxrwxr-x 4 t t 4096 Dec 2 11:29 .
drwxrwxr-x 6 t t 4096 Dec 2 07:49 ..
-rw-rw-r-- 2 t t 6 Dec 2 11:30 test
-rw-rw-r-- 2 t t 6 Dec 2 11:30 testhl
$ cat test
hello
谢谢。
答案1
如果现有的同名文件是可写的,是不是就意味着它可以被覆盖?
是的,这就是可写的意思。
它的硬链接数量对于以某种方式生成核心转储文件有影响吗?在以下情况下它工作得很好,不涉及核心转储,这是我困惑的根源(我来这里是为了澄清而不是为了让其他人感到困惑):
答案包含在您提到的引用中:
与用于核心转储同名的(可写、常规)文件已存在,但该文件有多个硬链接。
这意味着如果满足这两个条件,则不会创建 core 文件:
- 与要创建的核心文件(通常)同名的文件
core
已经存在并且可写。
和
- 该文件有多个硬链接指向它。
所以,是的,硬链接的数量在某种程度上很重要:联机帮助页说,如果文件有多个硬链接,则不会创建核心文件。
答案2
在 Ubuntu 中,默认情况下会提供核心转储/usr/share/apport/apport
,
$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
在 中/usr/share/apport/apport
,SIGQUIT 的信号处理是https://bazaar.launchpad.net/~apport-hackers/apport/trunk/view/3194/data/apport#L474
# ignore SIGQUIT (it's usually deliberately generated by users)
if signum == str(int(signal.SIGQUIT)):
drop_privileges()
write_user_coredump(pid, cwd, core_ulimit)
sys.exit(0)
在write_user_coredump()
,https://bazaar.launchpad.net/~apport-hackers/apport/trunk/view/3194/data/apport#L181
core_path = os.path.join(cwd, 'core')
try:
with open('/proc/sys/kernel/core_uses_pid') as f:
if f.read().strip() != '0':
core_path += '.' + str(pid)
core_file = os.open(core_path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
except (OSError, IOError):
return
os.O_CREAT | os.O_EXCL
如果文件core
已存在,将生成错误。这就解释了前半部分
与用于核心转储的名称相同的(可写、常规)文件已存在,但指向该文件的硬链接不只一个。
但
手册页中的“可写”非常具有误导性:“可写”的东西实际上是不可写的。
我仍然不明白“该文件有多个硬链接”是什么意思。我不知道代码中的硬链接数量会阻止覆盖或以某种方式起作用。