From 759ab41d725604c38fea9be658fe93f046f59293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Gia=20Phong?= Date: Tue, 9 Jul 2024 21:30:46 +0900 Subject: [PATCH] Allow setting PGID in std.process.Child.spawn --- lib/std/process/Child.zig | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/std/process/Child.zig b/lib/std/process/Child.zig index c4a7911e21..dfe0c6578e 100644 --- a/lib/std/process/Child.zig +++ b/lib/std/process/Child.zig @@ -63,6 +63,9 @@ uid: if (native_os == .windows or native_os == .wasi) void else ?posix.uid_t, /// Set to change the group id when spawning the child process. gid: if (native_os == .windows or native_os == .wasi) void else ?posix.gid_t, +/// Set to change the process group id when spawning the child process. +pgid: if (native_os == .windows or native_os == .wasi) void else ?posix.pid_t, + /// Set to change the current working directory when spawning the child process. cwd: ?[]const u8, /// Set to change the current working directory when spawning the child process. @@ -168,6 +171,7 @@ pub const SpawnError = error{ } || posix.ExecveError || posix.SetIdError || + posix.SetPgidError || posix.ChangeCurDirError || windows.CreateProcessError || windows.GetProcessMemoryInfoError || @@ -213,6 +217,7 @@ pub fn init(argv: []const []const u8, allocator: mem.Allocator) ChildProcess { .cwd = null, .uid = if (native_os == .windows or native_os == .wasi) {} else null, .gid = if (native_os == .windows or native_os == .wasi) {} else null, + .pgid = if (native_os == .windows or native_os == .wasi) {} else null, .stdin = null, .stdout = null, .stderr = null, @@ -675,6 +680,10 @@ fn spawnPosix(self: *ChildProcess) SpawnError!void { posix.setreuid(uid, uid) catch |err| forkChildErrReport(err_pipe[1], err); } + if (self.pgid) |pid| { + posix.setpgid(0, pid) 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),