On Fri, 14 Feb 2020 at 03:58, Rasmus Villemoes <rasmus.villem...@prevas.dk> wrote: > > Hitting Ctrl-C is a documented way to exit the sandbox, but it is not > actually equivalent to the reset command. The latter, since it follows > normal process exit, takes care to reset terminal settings and > restoring the O_NONBLOCK behaviour of stdin (and, in a terminal, that > is usually the same file description as stdout and stderr, i.e. some > /dev/pts/NN). > > Failure to restore (remove) O_NONBLOCK from stdout/stderr can cause > very surprising and hard to debug problems back in the terminal. For > example, I had "make -j8" consistently failing without much > information about just exactly what went wrong, but sometimes I did > get a "echo: write error". I was at first afraid my disk was getting > bad, but then a simple "dmesg" _also_ failed with write error - so it > was writing to the terminal that was buggered. And both "make -j8" and > dmesg in another terminal window worked just fine. > > So install a SIGINT handler so that if the chosen terminal > mode (cooked or raw-with-sigs) means Ctrl-C sends a SIGINT, we will > still call os_fd_restore(), then reraise the signal and die as usual > from SIGINT. > > Before: > > $ grep flags /proc/$$/fdinfo/1 > flags: 0102002 > $ ./u-boot > # hit Ctrl-C > $ grep flags /proc/$$/fdinfo/1 > flags: 0106002 > > After: > > $ grep flags /proc/$$/fdinfo/1 > flags: 0102002 > $ ./u-boot > # hit Ctrl-C > $ grep flags /proc/$$/fdinfo/1 > flags: 0102002 > > Signed-off-by: Rasmus Villemoes <rasmus.villem...@prevas.dk> > --- > arch/sandbox/cpu/os.c | 9 +++++++++ > 1 file changed, 9 insertions(+)
Nice explanation, thank you. Reviewed-by: Simon Glass <s...@chromium.org>