Вывод strace ( si_code )
Почему при получении SIGPIPE в выводе strace ( si_code == SI_USER )?
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=40000, si_uid=800} ---
+++ killed by SIGPIPE +++
Выдержка из man страницы strace.
Signals are printed as signal symbol and decoded siginfo structure.
An excerpt from stracing and interrupting the command "sleep 666" is:
sigsuspend([] <unfinished ...>
--- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
+++ killed by SIGINT +++
Выдержка из man страницы системного вызова sigaction.
For a regular signal, the following list shows the values which can be placed
in si_code for any signal, along with the reason that the signal was generated.
SI_USER
kill(2).
Но я не вижу в выводе strace системного вызова kill. Почему ( si_code == SI_USER )?
Ответы (1 шт):
Ничего особого примечательного здесь нет: просто документация несколько неполна. При системном вызове kill() в siginfo_t всегда будет si_code==SI_USER, но обратное, вообще говоря, неверно: сигнал с si_code==SI_USER может быть послан и при других событиях в самом процессе, в частности, при вызовах raise() и abort() или, например, как здесь, при попытке записи в сломанную трубу. Единственное что, в отличии от сигнала с SI_KERNEL, он обеспечивает установку корректных значений в поля si_pid и si_uid.
POSIX также явно допускает подобное поведение.