zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit bf15c791faa7bf5a029ec58432b3e8e16c691dff (tree)
parent 852a1f718a306aa0a540c527a0c23d50b9f0db08
Author: Alex Rønne Petersen <alex@alexrp.com>
Date:   Fri,  7 Nov 2025 23:17:55 +0100

Merge pull request #25820 from GiuseppeCesarano/process

Child.start_suspended ported to posix
Diffstat:
Mlib/std/posix.zig | 8++++++++
Mlib/std/posix/test.zig | 15+++++++++++++++
Mlib/std/process/Child.zig | 8++++++--
3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/lib/std/posix.zig b/lib/std/posix.zig @@ -1699,6 +1699,14 @@ pub fn dup2(old_fd: fd_t, new_fd: fd_t) !void { } } +pub fn getpid() pid_t { + return system.getpid(); +} + +pub fn getppid() pid_t { + return system.getppid(); +} + pub const ExecveError = error{ SystemResources, AccessDenied, diff --git a/lib/std/posix/test.zig b/lib/std/posix/test.zig @@ -621,6 +621,21 @@ test "dup & dup2" { try testing.expectEqualStrings("dupdup2", try tmp.dir.readFile("os_dup_test", &buffer)); } +test "getpid" { + if (native_os == .wasi) return error.SkipZigTest; + if (native_os == .windows) return error.SkipZigTest; + + try expect(posix.getpid() != 0); +} + +test "getppid" { + if (native_os == .wasi) return error.SkipZigTest; + if (native_os == .windows) return error.SkipZigTest; + if (native_os == .plan9 and !builtin.link_libc) return error.SkipZigTest; + + try expect(posix.getppid() >= 0); +} + test "writev longer than IOV_MAX" { if (native_os == .windows or native_os == .wasi) return error.SkipZigTest; diff --git a/lib/std/process/Child.zig b/lib/std/process/Child.zig @@ -85,8 +85,8 @@ expand_arg0: Arg0Expand, /// Darwin-only. Disable ASLR for the child process. disable_aslr: bool = false, -/// Darwin and Windows only. Start child process in suspended state. For Darwin it's started -/// as if SIGSTOP was sent. +/// Start child process in suspended state. +/// For Posix systems it's started as if SIGSTOP was sent. start_suspended: bool = false, /// Windows-only. Sets the CREATE_NO_WINDOW flag in CreateProcess. @@ -669,6 +669,10 @@ fn spawnPosix(self: *ChildProcess) SpawnError!void { posix.setpgid(0, pid) catch |err| forkChildErrReport(err_pipe[1], err); } + if (self.start_suspended) { + posix.kill(posix.getpid(), .STOP) catch |err| forkChildErrReport(err_pipe[1], err); + } + const err = switch (self.expand_arg0) { .expand => posix.execvpeZ_expandArg0(.expand, argv_buf.ptr[0].?, argv_buf.ptr, envp), .no_expand => posix.execvpeZ_expandArg0(.no_expand, argv_buf.ptr[0].?, argv_buf.ptr, envp),