mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
std: add c._exit() and use in ChildProcess
This issue with atexit() functions after forking isn't isolated to linux I'm sure, the proper way to do this when linking libc is to use _exit(2)
This commit is contained in:
parent
e5894221f7
commit
988ddd1bed
@ -81,6 +81,7 @@ pub extern "c" fn fread(ptr: [*]u8, size_of_type: usize, item_count: usize, stre
|
||||
pub extern "c" fn printf(format: [*:0]const u8, ...) c_int;
|
||||
pub extern "c" fn abort() noreturn;
|
||||
pub extern "c" fn exit(code: c_int) noreturn;
|
||||
pub extern "c" fn _exit(code: c_int) noreturn;
|
||||
pub extern "c" fn isatty(fd: fd_t) c_int;
|
||||
pub extern "c" fn close(fd: fd_t) c_int;
|
||||
pub extern "c" fn lseek(fd: fd_t, offset: off_t, whence: c_int) off_t;
|
||||
|
||||
@ -848,8 +848,9 @@ fn forkChildErrReport(fd: i32, err: ChildProcess.SpawnError) noreturn {
|
||||
// which we really do not want to run in the fork child. I caught LLVM doing this and
|
||||
// it caused a deadlock instead of doing an exit syscall. In the words of Avril Lavigne,
|
||||
// "Why'd you have to go and make things so complicated?"
|
||||
if (std.Target.current.os.tag == .linux) {
|
||||
std.os.linux.exit(1); // By-pass libc regardless of whether it is linked.
|
||||
if (builtin.link_libc) {
|
||||
// The _exit(2) function does nothing but make the exit syscall, unlike exit(3)
|
||||
std.c._exit(1);
|
||||
}
|
||||
os.exit(1);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user