diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 38e4abd197ba6c17245e7fe7038d7db0528ca395..16ae6587fb53f17e1ac6492431be4de75e7c1cbd 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -2774,7 +2774,7 @@ pub fn sigaddset(set: *sigset_t, sig: SIG) void { pub fn sigdelset(set: *sigset_t, sig: SIG) void { const index = sigset_bit_index(sig); - (set.*)[index.word] ^= index.mask; + (set.*)[index.word] &= ~index.mask; } pub fn sigismember(set: *const sigset_t, sig: SIG) bool { diff --git a/lib/std/os/linux/test.zig b/lib/std/os/linux/test.zig index 1a22e8f24a264d960040adde43a0070dc9d2fc96..552db88825d8c1a7d697b723cfc57f1d8a9abc72 100644 --- a/lib/std/os/linux/test.zig +++ b/lib/std/os/linux/test.zig @@ -159,6 +159,14 @@ test "sigset_t" { } } +test "sigdelset" { + var set = linux.sigemptyset(); + + // Deleting an absent signal must leave it absent. + linux.sigdelset(&set, linux.SIG.USR1); + try expectEqual(false, linux.sigismember(&set, linux.SIG.USR1)); +} + test "sigfillset" { // unlike the C library, all the signals are set in the kernel-level fillset const sigset = linux.sigfillset();