diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-05-01 18:47:26 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-05-01 18:47:26 +0300 |
commit | 11bc21dfa8f087ae2d95f378267ef270a85029ad (patch) | |
tree | eb485b4091e69586825c7d7b51fe39a5ddd04858 /unix | |
parent | 5db55e63f3e7a5beda732c241693e37e3a7b099f (diff) | |
download | micropython-11bc21dfa8f087ae2d95f378267ef270a85029ad.tar.gz micropython-11bc21dfa8f087ae2d95f378267ef270a85029ad.zip |
unix/main: Ignore SIGPIPE signal, instead make EPIPE arrive.
Do not raise SIGPIPE, instead return EPIPE. Otherwise, e.g. writing
to peer-closed socket will lead to sudden termination of MicroPython
process. SIGPIPE is particularly nasty, because unix shell doesn't
print anything for it, so the above looks like completely sudden and
silent termination for unknown reason. Ignoring SIGPIPE is also what
CPython does. Note that this may lead to problems using MicroPython
scripts as pipe filters, but again, that's what CPython does. So,
scripts which want to follow unix shell pipe semantics (where SIGPIPE
means "pipe was requested to terminate, it's not an error"), should
catch EPIPE themselves.
Diffstat (limited to 'unix')
-rw-r--r-- | unix/main.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/unix/main.c b/unix/main.c index edea7900d2..84570eb9f6 100644 --- a/unix/main.c +++ b/unix/main.c @@ -35,6 +35,7 @@ #include <sys/stat.h> #include <sys/types.h> #include <errno.h> +#include <signal.h> #include "py/mpstate.h" #include "py/nlr.h" @@ -414,6 +415,20 @@ int main(int argc, char **argv) { } MP_NOINLINE int main_(int argc, char **argv) { + #ifdef SIGPIPE + // Do not raise SIGPIPE, instead return EPIPE. Otherwise, e.g. writing + // to peer-closed socket will lead to sudden termination of MicroPython + // process. SIGPIPE is particularly nasty, because unix shell doesn't + // print anything for it, so the above looks like completely sudden and + // silent termination for unknown reason. Ignoring SIGPIPE is also what + // CPython does. Note that this may lead to problems using MicroPython + // scripts as pipe filters, but again, that's what CPython does. So, + // scripts which want to follow unix shell pipe semantics (where SIGPIPE + // means "pipe was requested to terminate, it's not an error"), should + // catch EPIPE themselves. + signal(SIGPIPE, SIG_IGN); + #endif + mp_stack_set_limit(40000 * (BYTES_PER_WORD / 4)); pre_process_options(argc, argv); |