diff --git a/lib/std/c.zig b/lib/std/c.zig index f22112a086f7..196460d54e56 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -2662,6 +2662,8 @@ pub const SIG = switch (native_os) { pub const IOT: SIG = .ABRT; pub const POLL: SIG = .EMT; + /// Invalid signal. Used in kill to perform checking without sending signal. + INVAL = 0, /// hangup HUP = 1, /// interrupt @@ -2756,6 +2758,7 @@ pub const SIG = switch (native_os) { pub const RTMIN = 65; pub const RTMAX = 126; + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, @@ -2821,6 +2824,7 @@ pub const SIG = switch (native_os) { pub const POLL: SIG = .IO; + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, @@ -2895,6 +2899,7 @@ pub const SIG = switch (native_os) { pub const IOT: SIG = .ABRT; + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, @@ -2941,6 +2946,7 @@ pub const SIG = switch (native_os) { pub const IOT: SIG = .ABRT; + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, @@ -2989,6 +2995,7 @@ pub const SIG = switch (native_os) { pub const IOT: SIG = .ABRT; + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, @@ -3035,6 +3042,7 @@ pub const SIG = switch (native_os) { pub const IOT: SIG = .ABRT; + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 2029356a66b5..4bffaded7708 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -3741,6 +3741,8 @@ pub const SIG = if (is_mips) enum(u32) { pub const IOT: SIG = .ABRT; pub const POLL: SIG = .IO; + INVAL = 0, + // /arch/mips/include/uapi/asm/signal.h#L25 HUP = 1, INT = 2, @@ -3787,6 +3789,8 @@ pub const SIG = if (is_mips) enum(u32) { pub const PWR: SIG = .LOST; pub const POLL: SIG = .IO; + /// Perform error checking without sending signal. + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, @@ -3830,6 +3834,8 @@ pub const SIG = if (is_mips) enum(u32) { pub const POLL: SIG = .IO; pub const IOT: SIG = .ABRT; + /// Perform error checking without sending signal. + INVAL = 0, HUP = 1, INT = 2, QUIT = 3, diff --git a/lib/std/os/plan9.zig b/lib/std/os/plan9.zig index 36bf83b21c02..bd476c73ff82 100644 --- a/lib/std/os/plan9.zig +++ b/lib/std/os/plan9.zig @@ -141,6 +141,8 @@ pub fn getpid() u32 { return tos.pid; } pub const SIG = struct { + /// Invalid signal. Used in kill to perform checking without sending signal. + pub const INVAL = 0; /// hangup pub const HUP = 1; /// interrupt diff --git a/test/standalone/posix/build.zig b/test/standalone/posix/build.zig index 52ec99628db2..bdfd793975bf 100644 --- a/test/standalone/posix/build.zig +++ b/test/standalone/posix/build.zig @@ -20,6 +20,9 @@ const cases = [_]Case{ .{ .src_path = "relpaths.zig", }, + .{ + .src_path = "kill.zig", + }, }; pub fn build(b: *std.Build) void { diff --git a/test/standalone/posix/kill.zig b/test/standalone/posix/kill.zig new file mode 100644 index 000000000000..3dd3bbc340fd --- /dev/null +++ b/test/standalone/posix/kill.zig @@ -0,0 +1,24 @@ +const std = @import("std"); +const posix = std.posix; +const builtin = @import("builtin"); +const native_os = builtin.target.os.tag; + +pub fn main() !void { + try test_kill_zero_self_should_succeed(); + try test_kill_nonexistent(); +} + +fn test_kill_nonexistent() !void { + if ((native_os != .linux) and (native_os != .macos)) return; + // Linux is limited by PID_MAX_LIMIT constant which is around 4 million + // MacOS maximum pid appears to be 99999 and not configurable. + // Others are unknown thus not tested. + const impossible_pid: posix.pid_t = 1_999_999_999; + try std.testing.expectError(posix.KillError.ProcessNotFound, posix.kill(impossible_pid, .INVAL)); +} + +fn test_kill_zero_self_should_succeed() !void { + // Windows does not have kill -0 equivalent + if (native_os == .windows) return; + try posix.kill(posix.getpid(), .INVAL); +}