.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 2006, 2008 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH core 5 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
core \- plik zrzutu pamięci
.SH OPIS
Dla pewnych sygnałów domyślną akcją procesu jest zakończenie działania i
utworzenie \fIpliku zrzutu pamięci\fP (core), czyli pliku zawierającego obraz
pamięci procesu w czasie, gdy został on zakończony. Dowolny debugger
(np. \fBgdb\fP(1)) może użyć tego obrazu do zbadania stanu programu w czasie
jego zakończenia. Listę sygnałów powodujących utworzenie pliku core przez
proces można znaleźć w \fBsignal\fP(7).
.P
Proces może ustawić miękki limit zasobów \fBRLIMIT_CORE\fP, aby ograniczyć
maksymalny rozmiar pliku, który zostanie utworzony po otrzymaniu sygnału
powodującego zrzut pamięci; szczegółowe informacje można znaleźć w
\fBgetrlimit\fP(2).
.P
W następujących wypadkach plik zrzutu pamięci nie będzie utworzony:
.IP \[bu] 3
Proces nie ma uprawnień, aby zapisać plik zrzutu pamięci (Domyślnie plik ten
nazywa się \fIcore\fP lub \fIcore.pid\fP, gdzie \fIpid\fP jest identyfikatorem
procesu który zrzuca pamięć i jest tworzony w bieżącym katalogu roboczym
procesu. Nazwę tę można zmienić \- patrz niżej). Zapisywanie pliku zrzutu nie
powiedzie się również wtedy, gdy prawa katalogu, w którym ten plik miałby
być utworzony, nie pozwalają na zapis do niego lub gdy plik o tej samej
nazwie istnieje i nie jest zapisywalny lub nie jest zwykłym plikiem (ale
np. katalogiem lub dowiązaniem symbolicznym).
.IP \[bu]
Już istnieje (zapisywalny, zwykły) plik o tej samej nazwie, jaka zostałaby
użyta dla pliku zrzutu pamięci, jednakże plik ten ma więcej niż jedno
dowiązanie twarde.
.IP \[bu]
System plików, w którym zostałby utworzony plik zrzutu pamięci, jest pełny,
wyczerpał mu się limit i\-węzłów, jest zamontowany w trybie tylko do odczytu
albo użytkownik osiągnął przydział systemu plików.
.IP \[bu]
Nie istnieje katalog, w którym miałby być utworzony plik zrzutu pamięci.
.IP \[bu]
Limity zasobów \fBRLIMIT_CORE\fP (rozmiar pliku zrzutu pamięci) lub
\fBRLIMIT_FSIZE\fP (rozmiar pliku) dla procesu są ustawione na zero; patrz
\fBgetrlimit\fP(2) i dokumentacja wbudowanego w powłokę polecenia \fIulimit\fP
(lub \fIlimit\fP w powłoce \fIcsh\fP(1)). \fBRLIMIT_CORE\fP będzie ignorowane, gdy
system skonfigurowano do przekazywania zrzutów pamięci za pomocą potoku do
programu.
.IP \[bu]
Wykonywany przez proces plik binarny nie ma włączonych uprawnień do odczytu
(jest to zabezpieczenie, w celu wykluczenia sytuacji, gdy plik wykonywany,
którego odczyt jest niemożliwy, tworzyłby  \[em] potencjalnie odczytywalny
\[em] zrzut pamięci zawierający obraz pliku wykonywalnego).
.IP \[bu]
.\" FIXME . Perhaps relocate discussion of /proc/sys/fs/suid_dumpable
.\" and PR_SET_DUMPABLE to this page?
Proces uruchomił program z flagą set\-user\-ID (set\-group\-ID), którego
właścicielem jest użytkownik (grupa) inny niż rzeczywisty użytkownik (grupa)
procesu lub proces wykonujący program ma przywileje plikowe
(zob. \fBcapabilities\fP(7)). (Jednakże patrz w \fBprctl\fP(2) opis operacji
\fBPR_SET_DUMPABLE\fP oraz w \fBproc\fP(5) opis pliku
\fI/proc/sys/fs/suid_dumpable\fP).
.IP \[bu]
\fI/proc/sys/kernel/core_pattern\fP jest pusty i
\fI/proc/sys/kernel/core_uses_pid\fP zawiera wartość 0 (pliki te opisano
poniżej). Proszę zauważyć, że gdy \fI/proc/sys/kernel/core_pattern\fP jest
pusty i \fI/proc/sys/kernel/core_uses_pid\fP zawiera wartość 1, to pliki zrzutu
pamięci będą miały nazwy w postaci \fI.pid\fP, a pliki takie są ukryte, chyba
że poda się opcję \fBls\fP(1) \fI\-a\fP.
.IP \[bu]
.\" commit 046d662f481830e652ac34cd112249adde16452a
(od Linuksa 3.7) Jądro zostało zbudowane bez opcji \fBCONFIG_COREDUMP\fP.
.P
Dodatkowo zrzut pamięci może nie zawierać części przestrzeni adresowej
procesu jeśli użyto flagi \fBMADV_DONTDUMP\fP \fBmadvise\fP(2).
.P
.\"
W systemach korzystającym z \fBsystemd\fP(1) jako \fIinit\fP, pliki zrzutu pamięci
mogą być w zamian umieszczane w położeniu wskazanym przez
\fBsystemd\fP(1). Więcej szczegółów poniżej.
.SS "Nazwy plików zrzutu pamięci"
Domyślnie plik zrzutu pamięci nazywa się \fIcore\fP, jednakże w pliku
\fI/proc/sys/kernel/core_pattern\fP (od wersji 2.6 i 2.4.21 Linuksa) można
zdefiniować szablon, który będzie użyty do nazywania plików zrzutu
pamięci. Szablon ten może zawierać specjalne znaczniki zaczynające się od
\[Bq]%\[rq], które podczas tworzenia pliku zrzutu będą zastąpione
następującymi wartościami:
.P
.RS 4
.PD 0
.TP  4
%%
Pojedynczy znak %.
.TP 
%c
Miękki limit zasobu rozmiaru pliku zrzutu pamięci procesu zrzucającego
pamięć (od Linuksa 2.6.24).
.TP 
%d
.\" Added in git commit 12a2b4b2241e318b4f6df31228e4272d2c2968a1
Tryb zrzutu \[em] taki sam jak wartość zwracana przez \fBprctl\fP(2)
\fBPR_GET_DUMPABLE\fP (od Linuksa 3.7).
.TP 
%e
Wartość \fIcomm\fP procesu lub wątku, zwykle równa nazwie pliku wykonywalnego
(bez przedrostka ścieżki i obcięta do maksymalnie 15 znaków), lecz mogąca
być również zmodyfikowana na inną wartość, zob. opis \fI/proc/\fPpid\fI/comm\fP i
\fI/proc/\fPpid\fI/task/\fPtid\fI/comm\fP w \fBproc\fP(5).
.TP 
%E
Nazwa ścieżki pliku wykonywalnego, z ukośnikami (\[Bq]/\[rq]) zastąpionymi
przez wykrzykniki (\[Bq]!\[rq]) (od Linuksa 3.0).
.TP 
%g
Numeryczny identyfikator grupy (GID) procesu, który zrzucił pamięć.
.TP 
%h
Nazwa komputera (taka sama jak \fInodename\fP zwracane przez \fBuname\fP(2)).
.TP 
%i
.\" commit b03023ecbdb76c1dec86b41ed80b123c22783220
identyfikator wątku (TID) który zainicjował zrzut pamięci, taki jak w
przestrzeni nazw PID\-ów w której wątek działa (od Linuksa 3.18).
.TP 
%I
.\" commit b03023ecbdb76c1dec86b41ed80b123c22783220
identyfikator wątku (TID) który zainicjował zrzut pamięci, taki jak w
początkowej przestrzeni nazw PID\-ów (od Linuksa 3.18).
.TP 
%p
identyfikator zrzucanego procesu, taki jak w przestrzeni nazw PID\-ów w
której proces działa.
.TP 
%P
.\" Added in git commit 65aafb1e7484b7434a0c1d4c593191ebe5776a2f
identyfikator zrzucanego procesu, taki jak w początkowej przestrzeni nazw
PID\-ów (od Linuksa 3.12).
.TP 
%s
Numer sygnału powodującego zrzut pamięci.
.TP 
%t
Czas zrzutu wyrażony w sekundach od początku epoki, czyli od 1970\-01\-01
00:00:00 +0000 (UTC).
.TP 
%u
Numeryczny identyfikator użytkownika (UID) procesu, który zrzucił pamięć.
.PD
.RE
.P
Jeśli szablon kończy się pojedynczym znakiem %, to znak ten zostanie
usunięty z nazwy pliku zrzutu. Podobnie zostaną usunięte wszelkie kombinacje
% ze znakami innymi niż te, wymienione powyżej. Wszystkie inne znaki
szablonu staną się częścią nazwy pliku zrzutu. Szablon może zawierać znaki
\[Bq]/\[rq], które są interpretowane jako separatory nazw
katalogów. Maksymalna długość wygenerowanej nazwy pliku wynosi 128 bajtów
(64 bajty w wersjach wcześniejszych niż Linux 2.6.19). Domyślną wartością
jest \[Bq]core\[rq]. W celu zachowania wstecznej zgodności, jeśli
\fI/proc/sys/kernel/core_pattern\fP nie zawiera \fI%p\fP, a
\fI/proc/sys/kernel/core_uses_pid\fP (patrz niżej) ma niezerową wartość, to
\&.PID będzie dołączony do nazwy pliku zrzutu.
.P
Ścieżki są interpretowane zgodnie z ustawieniami aktywnymi dla załamującego
się procesu. Oznacza to: przestrzeń nazw montowania
(zob. \fBmount_namespaces\fP(7)), jego bieżący katalog roboczy (odnaleziony za
pomocą \fBgetcwd\fP(2)) oraz jego katalog główny (zob. \fBchroot\fP(2)).
.P
Od Linuksa 2.4, Linux dostarcza również bardziej prymitywną metodę
kontrolowania nazwy pliku zrzutu pamięci. Gdy plik
\fI/proc/sys/kernel/core_uses_pid\fP zawiera wartość 0, plik zrzutu pamięci ma
po prostu nazwę \fIcore\fP. Gdy plik ten zawiera wartość niezerową, plik zrzutu
pamięci będzie zawierał w swojej nazwie ID procesu, w postaci \fIcore.PID\fP.
.P
.\" 9520628e8ceb69fa9a4aee6b57f22675d9e1b709
Od Linuksa 3.6 jeśli \fI/proc/sys/fs/suid_dumpable\fP ustawiono na 2
(\[Bq]suidsafe\[rq]) to wzorzec musi być albo ścieżką absolutną (zaczynającą
się znakiem \[Bq]/\[rq]) lub potokiem, zgodnie z poniższą definicją.
.SS "Przekazywanie zrzutów pamięci potokiem do programu"
Od wersji Linuksa 2.6.19, Linux obsługuje alternatywną składnię pliku
\fI/proc/sys/kernel/core_pattern\fP. Jeśli pierwszym znakiem pliki jest symbol
potoku (\fB|\fP), to wszystko, co po nim występuje, jest interpretowane jako
wiersz polecenia dla programu w przestrzeni użytkownika (lub skryptu), który
ma być wykonany.
.P
.\" commit 315c69261dd3fa12dbc830d4fa00d1fad98d3b03
Od Linuksa 5.3.0, szablon potoku jest dzielony na spacjach na listę
argumentów \fIprzed\fP rozwinięciem parametrów szablonu. We wcześniejszych
jądrach parametry szablonu były najpierw rozwijane, a wynikowy łańcuch był
dzielony na spacjach na listę argumentów. Oznacza to, że we wcześniejszych
jądrach, nazwy plików wykonywalnych dodawane za pomocą parametrów szablonu
\fI%e\fP i \fI%E\fP mogły ulec podzieleniu na wiele argumentów. Procedura obsługi
zrzutu pamięci musi zatem umieszczać nazwy plików wykonywalnych jako ostatni
argument i upewnić się, że połączy wszystkie składowe nazwy pliku
wykonywalnego używającego spacji. Nazwy plików wykonywalnych zawierające
wiele spacji nie były prawidłowo reprezentowane we wcześniejszych jądrach,
co oznacza, że procedura obsługi zrzutu pamięci musi używać mechanizmów do
odnalezienia nazwy pliku wykonywalnego.
.P
Zamiast zostać zapisanym na dysku, zrzut pamięci jest przekazywany na
standardowe wejście programu. Proszę zauważyć, że:
.IP \[bu] 3
Program musi być podany używając ścieżki bezwzględnej (lub ścieżki względnej
w stosunku do korzenia systemu plików, czyli katalogu \fI/\fP) i musi
występować bezpośrednio po znaku \[Bq]|\[rq].
.IP \[bu]
Argumenty linii poleceń mogą zawierać dowolne z wymienionych powyżej
specyfikatorów %. Na przykład, aby przekazać identyfikator procesu
zrzucającego pamięć, należy podać \fI%p\fP jako argument.
.IP \[bu]
Proces tworzony do wykonania programu jest wykonywany jako użytkownik i
grupa \fIroot\fP.
.IP \[bu]
Uruchomienie jako \fIroot\fP nie pomija w żaden sposób procedur
bezpieczeństwa. Przede wszystkim, LSM\-y (np. SELinux) są wciąż aktywne i
mogą zapobiec uzyskaniu szczegółów poprzez \fI/proc/\fPpid, przez procedurę
obsługi, na temat załamanego procesu.
.IP \[bu]
Ścieżka programu jest interpretowana zgodnie z początkową przestrzenią nazw
montowań, jako że zawsze jest on tu wykonywany. Nie mają na nią wpływu
ustawienia (np. katalog główny, przestrzeń nazw montowań, bieżący katalog
roboczy) załamującego się procesu.
.IP \[bu]
Proces działa w swoich pierwotnych przestrzeniach nazw (PID, montowania,
użytkownika itd.), a nie w przestrzeniach nazw załamującego się
procesu. Można użyć znaczników, takich jak \fI%P\fP, aby odnaleźć właściwy
katalog \fI/proc/\fPpid i sprawdzić/wejść w przestrzenie nazw załamującego się
procesu, jeśli jest taka potrzeba.
.IP \[bu]
Proces uruchamia się ze swoim bieżącym katalogiem roboczym jako katalogiem
głównym. Jeśli to wskazane, można zmienić katalog roboczy zrzucanego procesu
za pomocą wartości podanej przez znacznik \fI%P\fP, aby zmienić położenie
zrzucanego procesu za pomocą \fI/proc/\fPpid\fI/cwd\fP.
.IP \[bu]
Można przekazać do programu argumenty linii poleceń (od Linuksa 2.6.24),
rozdzielając je spacjami (aż do wyczerpania limitu całkowitej długości linii
wynoszącego 128 bajtów).
.IP \[bu]
.\"
Limit \fBRLIMIT_CORE\fP nie jest pilnowany w przypadku zrzutów pamięci, które
są przekazywane potokiem za pomocą tego mechanizmu.
.SS /proc/sys/kernel/core_pipe_limit
Przy zbieraniu zrzutów pamięci za pomocą potoku do program w przestrzeni
użytkownika, może okazać się przydatne zbieranie danych o załamującym się
procesie z katalogu \fI/proc/\fPpid procesu. Aby uczynić to bezpiecznie, jądro
musi zaczekać na wyjście przez program zbierający zrzut pamięci, aby nie
usuwać przedwcześnie plików \fI/proc/\fPpid załamującego się procesu. Z drugiej
jednak strony, daje to możliwość blokowania dorzynania (ang. reaping)
załamanego procesu, przez niepoprawnie działający program zbierający, który
może nigdy nie wyjść.
.P
.\" commit a293980c2e261bd5b0d2a77340dd04f684caff58
Od Linuksa 2.6.32, można użyć \fI/proc/sys/kernel/core_pipe_limit\fP do obrony
przed taką ewentualnością. Wartość pliku definiuje, jak wiele współbieżnych
załamujących się procesów można przekazać równolegle, potokiem, do programów
w przestrzeni użytkownika. Po przekroczeniu tej wartości, załamujące się
programy niemieszczące się w tej wartości są odnotowywane w dzienniku jądra,
a ich zrzuty pamięci są pomijane.
.P
.\"
Wartość 0 w tym pliku ma specjalne znaczenie. Oznacza, że równolegle może
być przechwytywana nieograniczona liczba procesów, ale nie zajdzie żadne
oczekiwanie (tj. program zbierający nie ma gwarancji dostępu do
\fI/proc/<załamujący\-się\-PID>\fP). Domyślną wartością pliku jest 0.
.SS "Kontrolowanie mapowań zapisywanych do pliku zrzutu pamięci"
Od Linuksa 2.6.23, można użyć specyficznego dla Linuksa pliku
\fI/proc/\fPPID\fI/coredump_filter\fP do kontrolowania, które segmenty pamięci
zostaną zapisane do pliku zrzutu pamięci, w przypadku gdy pamięć jest
zrzucana przez proces o podanym identyfikatorze.
.P
Wartość w tym pliku jest maską bitową typów mapowań pamięci (patrz
\fBmmap\fP(2)). Jeśli bit jest ustawiony w masce, to odpowiadające mu mapowanie
jest zapisywane w pliku, w przeciwnym wypadku \- nie jest. Bity w masce mają
następujące znaczenia:
.P
.PD 0
.RS 4
.TP 
bit 0
Zrzucanie anonimowych mapowań prywatnych.
.TP 
bit 1
Zrzucanie anonimowych mapowań współdzielonych.
.TP 
bit 2
Zrzucanie prywatnych mapowań plików.
.TP 
bit 3
.\" file-backed shared mappings of course also update the underlying
.\" mapped file.
Zrzucanie współdzielonych mapowań plików.
.TP 
bit 4 (od Linuksa 2.6.24)
Zrzucanie nagłówków ELF.
.TP 
bit 5 (od Linuksa 2.6.28)
Zrzucanie prywatnych dużych stron.
.TP 
bit 6 (od Linuksa 2.6.28)
Zrzucanie współdzielonych dużych stron.
.TP 
bit 7 (od Linuksa 4.4)
.\" commit ab27a8d04b32b6ee8c30c14c4afd1058e8addc82
Zrzucanie prywatnych stron DAX.
.TP 
bit 8 (od Linuksa 4.4)
.\" commit ab27a8d04b32b6ee8c30c14c4afd1058e8addc82
Zrzucanie współdzielonych stron DAX.
.RE
.PD
.P
Domyślnie ustawione są następujące bity: 0, 1, 4 (jeśli jest włączona opcja
\fBCONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS\fP konfiguracji jądra) oraz 5. Tę
wartość domyślną można zmodyfikować przy rozruchu za pomocą opcji
\fIcoredump_filter\fP.
.P
Wartość tego pliku jest wyświetlana szesnastkowo (z tego powodu domyślna
wartość jest wyświetlana jako 33).
.P
Strony wejścia/wyjścia mapowane w pamięci, takie jak bufor ramki, nigdy nie
są zrzucane, a wirtualne strony DSO (\fBvdso\fP(7)) są zawsze zrzucane,
niezależnie od wartości \fIcoredump_filter\fP.
.P
Proces\-dziecko utworzony przez \fBfork\fP(2) dziedziczy wartość
\fIcoredump_filter\fP od swojego rodzica; wartość ta jest także zachowywana
podczas \fBexecve\fP(2).
.P
Może być użyteczne ustawienie \fIcoredump_filter\fP w powłoce przed
uruchomieniem programu, na przykład:
.P
.in +4n
.EX
$\fB echo 0x7 > /proc/self/coredump_filter\fP
$\fB ./some_program\fP
.EE
.in
.P
.\"
Plik istnieje, jeśli jądro zostało zbudowane z włączoną opcją konfiguracji
\fBCONFIG_ELF_CORE\fP.
.SS "Zrzuty pamięci i systemd"
W systemach korzystających z \fIinit\fP w postaci \fBsystemd\fP(1), zrzuty pamięci
mogą być umieszczane w położeniu określanym przez
\fBsystemd\fP(1). \fBsystemd\fP(1) używa do tego funkcji \fIcore_pattern\fP, która
pozwala na przekazywanie potokiem zrzutów pamięci do programu. Można to
zweryfikować, sprawdzając czy zrzuty pamięci są przekazywane potokiem do
programu \fBsystemd\-coredump\fP(8):
.P
.in +4n
.EX
$ \fBcat /proc/sys/kernel/core_pattern\fP
|/usr/lib/systemd/systemd\-coredump %P %u %g %s %t %c %e
.EE
.in
.P
W tym przypadku, zrzuty pamięci będą umieszczane w położeniu skonfigurowanym
dla \fBsystemd\-coredump\fP(8), zwykle jako pliki skompresowane \fBlz4\fP(1), w
katalogu \fI/var/lib/systemd/coredump/\fP. Można wypisać listę zarejestrowanych
przez \fBsystemd\-coredump\fP(8) zrzutów pamięci za pomocą \fBcoredumpctl\fP(1):
.P
.EX
$ \fBcoredumpctl list | tail \-5\fP
Wed 2017\-10\-11 22:25:30 CEST  2748 1000 1000 3 present  /usr/bin/sleep
Thu 2017\-10\-12 06:29:10 CEST  2716 1000 1000 3 present  /usr/bin/sleep
Thu 2017\-10\-12 06:30:50 CEST  2767 1000 1000 3 present  /usr/bin/sleep
Thu 2017\-10\-12 06:37:40 CEST  2918 1000 1000 3 present  /usr/bin/cat
Thu 2017\-10\-12 08:13:07 CEST  2955 1000 1000 3 present  /usr/bin/cat
.EE
.P
Informacje pokazywane dla każdego zrzutu pamięci obejmują datę i czas
zrzutu, identyfikatory: procesu, użytkownika i grupy zrzucającego procesu,
numer sygnału powodującego zrzut i ścieżka do pliku wykonywalnego, który był
uruchomiony przez zrzucany proces. Można podać do \fBcoredumpctl\fP(1) wiele
opcji, które pozwalają wskazać plik zrzutu pamięci, który ma być wyciągnięty
z lokalizacji \fBsystemd\fP(1) do określonego pliku. Na przykład, aby wydobyć
zrzut pamięci dla procesu o PID 2955 pokazanego powyżej, do pliku nazwanego
\fIcore\fP w bieżącym katalogu można użyć polecenia:
.P
.in +4n
.EX
$ \fBcoredumpctl dump 2955 \-o core\fP
.EE
.in
.P
Więcej szczegółów znajduje się w podręczniku systemowym \fBcoredumpctl\fP(1).
.P
Aby (na stałe) wyłączyć mechanizm \fBsystemd\fP(1) archiwizujący zrzuty
pamięci, przywracając bardziej tradycyjne zachowanie linuksowe, można
przesłonić mechanizm \fBsystemd\fP(1), za pomocą konstrukcji podobnej do
poniżej:
.P
.in +4n
.EX
# \fBecho "kernel.core_pattern=core.%p" > \[rs]\fP
               \fB/etc/sysctl.d/50\-coredump.conf\fP
# \fB/lib/systemd/systemd\-sysctl\fP
.EE
.in
.P
Można również tymczasowo (do następnego przeładowania systemu) zmienić
ustawienie \fIcore_pattern\fP poleceniem podobnym do poniższego (które powoduje
włączenie do nazw zrzutu pamięci również nazwy pliku wykonywalnego i numer
sygnału wyzwalające zrzut pamięci):
.P
.in +4n
.EX
# \fBsysctl \-w kernel.core_pattern="%e\-%s.core"\fP
.EE
.in
.\"
.SH UWAGI
Aby uzyskać zrzut pamięci działającego procesu, można użyć polecenia
\fIgcore\fP programu \fBgdb\fP(1).
.P
.\" Changed with commit 6409324b385f3f63a03645b4422e3be67348d922
.\" Always including the PID in the name of the core file made
.\" sense for LinuxThreads, where each thread had a unique PID,
.\" but doesn't seem to serve any purpose with NPTL, where all the
.\" threads in a process share the same PID (as POSIX.1 requires).
.\" Probably the behavior is maintained so that applications using
.\" LinuxThreads continue appending the PID (the kernel has no easy
.\" way of telling which threading implementation the user-space
.\" application is using). -- mtk, April 2006
W wersjach jądra Linux do 2.6.27 włącznie, jeżeli pamięć zrzuca proces
wielowątkowy (albo \- bardziej precyzyjnie \- proces, który dzieli swą pamięć
z innym procesem utworzonym z flagą \fBCLONE_VM\fP funkcji \fBclone\fP(2)), to
identyfikator procesu zawsze będzie dołączony do nazwy pliku zrzutu, chyba
że ów identyfikator procesu już występuje w nazwie pliku, ponieważ w pliku
\fI/proc/sys/kernel/core_pattern\fP użyto specyfikatora \fIp\fP (Jest to
szczególnie użyteczne podczas stosowania przestarzałej implementacji
LinuxThreads, w której każdy wątek procesu ma inny PID).
.SH PRZYKŁADY
Poniższy program pokazuje użycie składni potoku w pliku
\fI/proc/sys/kernel/core_pattern\fP. Poniższa sesja powłoki demonstruje użycie
tego programu (skompilowanego do pliku o nazwie  \fIcore_pattern_pipe_test\fP):
.P
.in +4n
.EX
$\fB cc \-o core_pattern_pipe_test core_pattern_pipe_test.c\fP
$\fB su\fP
Hasło:
#\fB echo \[dq]|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s\[dq] > \[rs]\fP
\fB/proc/sys/kernel/core_pattern\fP
#\fB exit\fP
$\fB sleep 100\fP
\fB\[ha]\[rs]\fP                     # wpisz control+odwrotny ukośnik
Quit (core dumped)
$\fB cat core.info\fP
argc=5
argc[0]=</home/mtk/core_pattern_pipe_test>
argc[1]=<20575>
argc[2]=<UID=1000>
argc[3]=<GID=100>
argc[4]=<sig=3>
Całkowita liczba bajtów pliku core: 282624
.EE
.in
.SS "Kod źródłowy programu"
\&
.EX
/* core_pattern_pipe_test.c */
\&
#define _GNU_SOURCE
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
\&
#define BUF_SIZE 1024
\&
int
main(int argc, char *argv[])
{
    ssize_t nread, tot;
    char buf[BUF_SIZE];
    FILE *fp;
    char cwd[PATH_MAX];
\&
    /* Zmienia bieżący katalog roboczy na katalog procesu
       który generuje zrzut pamięci. */
\&
    snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
    chdir(cwd);
\&
    /* Zapisuje wyjście do pliku "core.info" w tym katalogu. */
\&
    fp = fopen("core.info", "w+");
    if (fp == NULL)
        exit(EXIT_FAILURE);
\&
    /* Wyświetla argumenty wiersza poleceń przekazane do programu
       filtrującego "core_pattern". */
\&
    fprintf(fp, "argc=%d\[rs]n", argc);
    for (size_t j = 0; j < argc; j++)
        fprintf(fp, "argc[%zu]=<%s>\[rs]n", j, argv[j]);
\&
    /* Zlicza bajty na standardowym wejściu (daje rozmiar
       zrzutu pamięci). */
\&
    tot = 0;
    while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
        tot += nread;
    fprintf(fp, "Całkowita liczba bajtów pliku core: %zd\[rs]n", tot);
\&
    fclose(fp);
    exit(EXIT_SUCCESS);
}
.EE
.SH "ZOBACZ TAKŻE"
\fBbash\fP(1), \fBcoredumpctl\fP(1), \fBgdb\fP(1), \fBgetrlimit\fP(2), \fBmmap\fP(2),
\fBprctl\fP(2), \fBsigaction\fP(2), \fBelf\fP(5), \fBproc\fP(5), \fBpthreads\fP(7),
\fBsignal\fP(7), \fBsystemd\-coredump\fP(8)
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
