bc: switch to SA_RESTART signal handling
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d70d4a0235
commit
17c5472c5a
@ -7121,7 +7121,23 @@ static BcStatus bc_vm_run(int argc, char *argv[],
|
||||
|
||||
if (G.ttyin) {
|
||||
#if ENABLE_FEATURE_BC_SIGNALS
|
||||
signal_no_SA_RESTART_empty_mask(SIGINT, record_signo);
|
||||
// With SA_RESTART, most system calls will restart
|
||||
// (IOW: they won't fail with EINTR).
|
||||
// In particular, this means ^C won't cause
|
||||
// stdout to get into "error state" if SIGINT hits
|
||||
// within write() syscall.
|
||||
// The downside is that ^C while line input is taken
|
||||
// will only be handled after [Enter] since read()
|
||||
// from stdin is not interrupted by ^C either,
|
||||
// it restarts, thus fgetc() does not return on ^C.
|
||||
signal_SA_RESTART_empty_mask(SIGINT, record_signo);
|
||||
|
||||
// Without SA_RESTART, this exhibits a bug:
|
||||
// "while (1) print 1" and try ^C-ing it.
|
||||
// Intermittently, instead of returning to input line,
|
||||
// you'll get "output error: Interrupted system call"
|
||||
// and exit.
|
||||
//signal_no_SA_RESTART_empty_mask(SIGINT, record_signo);
|
||||
#endif
|
||||
if (!(option_mask32 & BC_FLAG_Q))
|
||||
bc_vm_info();
|
||||
|
Loading…
Reference in New Issue
Block a user