authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-12-26 22:22:43+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-26 16:51:55-08:00
log988ddd1bed003f2c2e7436d5f245a06cb8d024ce
treec49caa1fe8eba717b77bd491df56ff049629d12e
parente5894221f7a886c8b0cc21b8369e4d3bf11890b0

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)

2 files changed, 4 insertions(+), 2 deletions(-)

lib/std/c.zig+1
...@@ -81,6 +81,7 @@ pub extern "c" fn fread(ptr: [*]u8, size_of_type: usize, item_count: usize, stre...@@ -81,6 +81,7 @@ pub extern "c" fn fread(ptr: [*]u8, size_of_type: usize, item_count: usize, stre
81pub extern "c" fn printf(format: [*:0]const u8, ...) c_int;81pub extern "c" fn printf(format: [*:0]const u8, ...) c_int;
82pub extern "c" fn abort() noreturn;82pub extern "c" fn abort() noreturn;
83pub extern "c" fn exit(code: c_int) noreturn;83pub extern "c" fn exit(code: c_int) noreturn;
84pub extern "c" fn _exit(code: c_int) noreturn;
84pub extern "c" fn isatty(fd: fd_t) c_int;85pub extern "c" fn isatty(fd: fd_t) c_int;
85pub extern "c" fn close(fd: fd_t) c_int;86pub extern "c" fn close(fd: fd_t) c_int;
86pub extern "c" fn lseek(fd: fd_t, offset: off_t, whence: c_int) off_t;87pub extern "c" fn lseek(fd: fd_t, offset: off_t, whence: c_int) off_t;
lib/std/child_process.zig+3-2
...@@ -848,8 +848,9 @@ fn forkChildErrReport(fd: i32, err: ChildProcess.SpawnError) noreturn {...@@ -848,8 +848,9 @@ fn forkChildErrReport(fd: i32, err: ChildProcess.SpawnError) noreturn {
848 // which we really do not want to run in the fork child. I caught LLVM doing this and848 // which we really do not want to run in the fork child. I caught LLVM doing this and
849 // it caused a deadlock instead of doing an exit syscall. In the words of Avril Lavigne,849 // it caused a deadlock instead of doing an exit syscall. In the words of Avril Lavigne,
850 // "Why'd you have to go and make things so complicated?"850 // "Why'd you have to go and make things so complicated?"
851 if (std.Target.current.os.tag == .linux) {851 if (builtin.link_libc) {
852 std.os.linux.exit(1); // By-pass libc regardless of whether it is linked.852 // The _exit(2) function does nothing but make the exit syscall, unlike exit(3)
853 std.c._exit(1);
853 }854 }
854 os.exit(1);855 os.exit(1);
855}856}