동일한 이름을 가진 쓰기 가능한 일반 파일이 있으면 코어 덤프 파일이 생성되지 않습니까? [폐쇄]

동일한 이름을 가진 쓰기 가능한 일반 파일이 있으면 코어 덤프 파일이 생성되지 않습니까? [폐쇄]

코어 맨페이지(5)코어 덤프 파일이 생성되지 않는 이유 중 하나는 다음과 같습니다.

코어 덤프에 사용된 것과 동일한 이름을 가진 (쓰기 가능, 일반) 파일이 이미 존재하지만 해당 파일에 대한 하드 링크가 두 개 이상 있습니다.

동일한 이름을 가진 기존 파일에 쓰기가 가능하다면 덮어쓸 수 있다는 의미인가요?

하드 링크 수는 코어 덤프 파일 생성에 어떤 영향을 미치나요?

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

동일한 이름을 가진 기존 파일에 쓰기가 가능하다면 덮어쓸 수 있다는 의미인가요?

예, 그것이 쓰기 가능하다는 의미입니다.

하드 링크 수가 코어 덤프 파일 생성에 어떤 영향을 미치나요? 잘 작동하며 다음과 같은 경우에는 코어 덤프가 포함되지 않습니다. 이는 혼란의 원인이었습니다(다른 사람을 혼동하지 않기 위해 여기에 있습니다).

답변은 귀하가 언급한 인용문에 포함되어 있습니다.

코어 덤프에 사용된 것과 동일한 이름의 (쓰기 가능, 일반) 파일이 이미 존재합니다.하지만 파일에 여러 개의 하드 링크가 있습니다..

이는 다음 두 가지 조건이 충족되면 코어 파일이 생성되지 않음을 의미합니다.

  1. 생성할 코어 파일과 동일한 이름(일반적으로)을 가진 파일이 core이미 존재하며 쓰기 가능합니다.

그리고

  1. 이 파일에는 해당 파일을 가리키는 여러 개의 하드 링크가 있습니다.

그렇습니다. 하드 링크 수는 어느 정도 중요합니다. 맨페이지에는 파일에 하드 링크가 여러 개 있으면 코어 파일이 생성되지 않는다고 나와 있습니다.

답변2

우분투에서는 기본적으로 코어 덤프가 제공되는데 /usr/share/apport/apport,

$ sysctl kernel.core_pattern 
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P

에서 /usr/share/apport/apportSIGQUIT의 신호 처리는 다음과 같습니다.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이미 존재하면 오류가 발생합니다. 전반부에 대한 설명입니다

코어 덤프에 사용된 것과 동일한 이름을 가진 (쓰기 가능, 일반) 파일이 이미 존재하지만 해당 파일에 대한 하드 링크가 두 개 이상 있습니다.

하지만

  • 매뉴얼 페이지의 "쓰기 가능"은 매우 오해의 소지가 있습니다. "쓰기 가능"은 실제로는 쓸 수 없습니다.

  • "파일에 여러 개의 하드 링크가 있습니다"라는 의미가 무엇인지 아직도 이해하지 못합니다. 코드의 하드 링크 수가 덮어쓰기를 방지하거나 어떻게든 작동하는지 모르겠습니다.

관련 정보