diff --git a/vlib/os/os.c.v b/vlib/os/os.c.v index 9e1945e6459b90..1bd015e6152026 100644 --- a/vlib/os/os.c.v +++ b/vlib/os/os.c.v @@ -429,10 +429,11 @@ pub fn system(cmd string) int { } $if !windows { pret, is_signaled := posix_wait4_to_exit_status(ret) + ret = pret if is_signaled { - println('Terminated by signal ${ret:2d} (' + sigint_to_signal_name(pret) + ')') + eprintln('Terminated by signal ${pret:2d} (' + sigint_to_signal_name(pret) + ')') + ret = pret + 128 } - ret = pret } return ret } @@ -541,7 +542,7 @@ pub fn rmdir(path string) ! { fn print_c_errno() { e := C.errno se := unsafe { tos_clone(&u8(C.strerror(e))) } - println('errno=${e} err=${se}') + eprintln('errno=${e} err=${se}') } // get_raw_line returns a one-line string from stdin along with '\n' if there is any. diff --git a/vlib/os/process_nix.c.v b/vlib/os/process_nix.c.v index 009a61f66c8779..d871a2536470db 100644 --- a/vlib/os/process_nix.c.v +++ b/vlib/os/process_nix.c.v @@ -83,42 +83,32 @@ fn (mut p Process) unix_kill_pgroup() { } fn (mut p Process) unix_wait() { - cstatus := 0 - mut ret := -1 - $if !emscripten ? { - ret = C.waitpid(p.pid, &cstatus, 0) - } - if ret == -1 { - p.err = posix_get_error_msg(C.errno) - return - } - pret, is_signaled := posix_wait4_to_exit_status(cstatus) - if is_signaled { - p.status = .aborted - p.err = 'Terminated by signal ${ret:2d} (${sigint_to_signal_name(pret)})' - } else { - p.status = .exited - } - p.code = pret + p.impl_check_pid_status(false, 0) } fn (mut p Process) unix_is_alive() bool { - cstatus := 0 + return p.impl_check_pid_status(true, C.WNOHANG) +} + +fn (mut p Process) impl_check_pid_status(exit_early_on_ret0 bool, waitpid_options int) bool { + mut cstatus := 0 mut ret := -1 $if !emscripten ? { - ret = C.waitpid(p.pid, &cstatus, C.WNOHANG) + ret = C.waitpid(p.pid, &cstatus, waitpid_options) } + p.code = ret if ret == -1 { p.err = posix_get_error_msg(C.errno) return false } - if ret == 0 { + if exit_early_on_ret0 && ret == 0 { return true } - pret, is_signaled := posix_wait4_to_exit_status(cstatus) + mut pret, is_signaled := posix_wait4_to_exit_status(cstatus) if is_signaled { p.status = .aborted - p.err = 'Terminated by signal ${ret:2d} (${sigint_to_signal_name(pret)})' + p.err = 'Terminated by signal ${pret:2d} (${sigint_to_signal_name(pret)})' + pret += 128 } else { p.status = .exited } diff --git a/vlib/v/builder/compile.v b/vlib/v/builder/compile.v index 0840b03f9f57b0..4bff65fce47a88 100644 --- a/vlib/v/builder/compile.v +++ b/vlib/v/builder/compile.v @@ -160,6 +160,9 @@ fn (mut b Builder) run_compiled_executable_and_exit() { os.signal_opt(.quit, prev_quit_handler) or { serror('restore .quit', err) } } ret = run_process.code + if run_process.err != '' { + eprintln(run_process.err) + } run_process.close() } b.cleanup_run_executable_after_exit(compiled_file)