コアマンページ(5)コアダンプファイルが生成されない理由の1つは次のとおりです。
コアダンプに使用されているのと同じ名前の(書き込み可能、一般)ファイルがすでに存在しますが、そのファイルへの複数のハードリンクがあります。
同じ名前の既存のファイルへの書き込みが可能であれば、上書きできるという意味ですか?
ハードリンク数はコアダンプファイルの生成にどのような影響を与えますか?
core
次の例では、コアダンプで上書きされないように、他のハードリンクなしでファイルを作成します。
$ 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
同じ名前の既存のファイルへの書き込みが可能であれば、上書きできるという意味ですか?
はい、それは書き込み可能であることを意味します。
ハードリンク数がコアダンプファイルの生成にどのような影響を与えますか?うまく機能し、次の場合はコアダンプは含まれません。これは混乱の原因でした(他の人を混同しないためにここにあります)。
答えはあなたが言及した引用符に含まれています。
コアダンプに使用されているのと同じ名前の(書き込み可能、一般)ファイルがすでに存在します。しかし、ファイルに複数のハードリンクがあります。。
これは、次の2つの条件が満たされるとコアファイルが生成されないことを意味します。
- 生成するコアファイルと同じ名前(通常は)を持つファイルが
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
すでに存在する場合、エラーが発生します。前半の説明です
コアダンプに使用されているのと同じ名前の(書き込み可能、一般)ファイルがすでに存在しますが、そのファイルへの複数のハードリンクがあります。
しかし、
マニュアルページの「書き込み可能」には誤解を招くおそれがあります。 「書き込み可能」は実際には書き込めません。
「ファイルに複数のハードリンクがあります」という意味が何であるかはまだわかりません。コード内のハードリンクの数が上書きされるのを防ぐかどうかはわかりません。