Skip to content

Restore sigpipe #72

Merged
merged 2 commits into from Mar 20, 2018
Merged

Restore sigpipe #72

merged 2 commits into from Mar 20, 2018

Conversation

donald
Copy link
Contributor

@donald donald commented Mar 20, 2018

mxqd: Restore SIGPIPE to default for job

The mysql client library sets SIGPIPE to SIG_IGN which gets inherited by
the user processes:

root@sigchld:~# cat /proc/27900/status |grep Sig
SigQ:   0/30656
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000000000000

This makes a difference for things like

 CMD | head -1

because CMD is not killed by SIGPIPE when head is finished. It will get
an error "broken pipe" on the next write and may or may not emit this to
stderr.

This bug was partially caused by #63, where we changed our own signal
handling to synchronous mode. While in the previous mode, we unknowingly
fixed the change done by the mysql library, we then just set and
reset the blocking mask, which doesn't restore an ignored signal.

Restore SIGCHLD to SIG_DFL when we initialize the child process for the
user.

With this patch applied, no more signals are blocked for the user
process.

buczek@theinternet:~/git/mxq (restore-sigpipe)$ cat /proc/17081/status |grep Sig
SigQ:   1/127301
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000

Fixes #71

plus one unrelated commit (typo in message)

The mysql client library sets SIGPIPE to SIG_IGN which gets inherited by
the user processes:

    root@sigchld:~# cat /proc/27900/status |grep Sig
    SigQ:   0/30656
    SigPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000000001000
    SigCgt: 0000000000000000

This makes a difference for things like

     CMD | head -1

because CMD is not killed by SIGPIPE when `head` is finished. It will get
an error "broken pipe" on the next write and may or may not emit this to
stderr.

This bug was partially caused by #63 (commit ff2f49f (mxqd: Use
synchronous signals)), where we changed our own signal handling to
synchronous mode. While in the previous mode, we unknowingly fixed the
change done by the mysql library, we then just set and reset the blocking
mask, which doesn't restore an ignored signal.

Restore SIGCHLD to SIG_DFL when we initialize the child process for the
user.

With this patch applied, no more signals are blocked for the user
process.

    buczek@theinternet:~/git/mxq (restore-sigpipe)$ cat /proc/17081/status |grep Sig
    SigQ:   1/127301
    SigPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000000000000
    SigCgt: 0000000000000000

Fixes: #71
@pmenzel
Copy link
Contributor

pmenzel commented Mar 20, 2018

I fixed two typos, and added the commit in question.

@pmenzel pmenzel merged commit 23530a8 into master Mar 20, 2018
donald added a commit to mariux64/bee-files that referenced this pull request Mar 21, 2018
Includes pull request mariux64/mxq#72 for issue mariux64/mxq#71
"mxqd starts user processes with SIGPIPE ignored"
@donald donald deleted the restore-sigpipe branch October 28, 2022 14:22
Sign in to join this conversation on GitHub.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

mxqd starts user processes with SIGPIPE ignored
2 participants