同名的可写常规文件的存在是否会阻止生成核心转储文件?

同名的可写常规文件的存在是否会阻止生成核心转储文件?

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 文件:

  1. 与要创建的核心文件(通常)同名的文件core已经存在并且可写。

  1. 该文件有多个硬链接指向它。

所以,是的,硬链接的数量在某种程度上很重要:联机帮助页说,如果文件有多个硬链接,则不会创建核心文件。

答案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已存在,将生成错误。这就解释了前半部分

与用于核心转储的名称相同的(可写、常规)文件已存在,但指向该文件的硬链接不只一个。

  • 手册页中的“可写”非常具有误导性:“可写”的东西实际上是不可写的。

  • 我仍然不明白“该文件有多个硬链接”是什么意思。我不知道代码中的硬链接数量会阻止覆盖或以某种方式起作用。

相关内容