diff --git a/vlib/v/builder/compile.v b/vlib/v/builder/compile.v index 8ff7726e4a..835e42b734 100644 --- a/vlib/v/builder/compile.v +++ b/vlib/v/builder/compile.v @@ -138,7 +138,19 @@ fn (mut b Builder) run_compiled_executable_and_exit() { if b.pref.is_verbose { println('running $run_process.filename with arguments $run_process.args') } + // Ignore sigint and sigquit while running the compiled file, + // so ^C doesn't prevent v from deleting the compiled file. + // See also https://git.musl-libc.org/cgit/musl/tree/src/process/system.c + prev_int_handler := os.signal_opt(.int, eshcb) or { serror('set .int', err) } + mut prev_quit_handler := os.SignalHandler(eshcb) + $if !windows { // There's no sigquit on windows + prev_quit_handler = os.signal_opt(.quit, eshcb) or { serror('set .quit', err) } + } run_process.wait() + os.signal_opt(.int, prev_int_handler) or { serror('restore .int', err) } + $if !windows { + os.signal_opt(.quit, prev_quit_handler) or { serror('restore .quit', err) } + } ret := run_process.code run_process.close() b.cleanup_run_executable_after_exit(compiled_file) @@ -147,6 +159,15 @@ fn (mut b Builder) run_compiled_executable_and_exit() { exit(0) } +fn eshcb(_ os.Signal) { +} + +[noreturn] +fn serror(reason string, e IError) { + eprintln('could not $reason handler') + panic(e) +} + fn (mut v Builder) cleanup_run_executable_after_exit(exefile string) { if v.pref.reuse_tmpc { v.pref.vrun_elog('keeping executable: $exefile , because -keepc was passed')