Вывод 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 шт):

Автор решения: Fat-Zer

Ничего особого примечательного здесь нет: просто документация несколько неполна. При системном вызове kill() в siginfo_t всегда будет si_code==SI_USER, но обратное, вообще говоря, неверно: сигнал с si_code==SI_USER может быть послан и при других событиях в самом процессе, в частности, при вызовах raise() и abort() или, например, как здесь, при попытке записи в сломанную трубу. Единственное что, в отличии от сигнала с SI_KERNEL, он обеспечивает установку корректных значений в поля si_pid и si_uid.

POSIX также явно допускает подобное поведение.

→ Ссылка