Fix issue 10587 - std.process.kill should fail for a terminated pid

https://github.com/dlang/phobos/issues/10587
This commit is contained in:
Vladimir Panteleev 2024-12-29 10:45:27 +00:00 committed by The Dlang Bot
parent 68da19aed8
commit 8c6fca9ccd

View file

@ -2815,6 +2815,10 @@ void kill(Pid pid, int codeOrSignal)
else version (Posix) else version (Posix)
{ {
import core.sys.posix.signal : kill; import core.sys.posix.signal : kill;
if (pid.osHandle == Pid.invalid)
throw new ProcessException("Pid is invalid");
if (pid.osHandle == Pid.terminated)
throw new ProcessException("Pid is already terminated");
if (kill(pid.osHandle, codeOrSignal) == -1) if (kill(pid.osHandle, codeOrSignal) == -1)
throw ProcessException.newFromErrno(); throw ProcessException.newFromErrno();
} }
@ -2856,7 +2860,7 @@ void kill(Pid pid, int codeOrSignal)
do { s = tryWait(pid); } while (!s.terminated); do { s = tryWait(pid); } while (!s.terminated);
version (Windows) assert(s.status == 123); version (Windows) assert(s.status == 123);
else version (Posix) assert(s.status == -SIGKILL); else version (Posix) assert(s.status == -SIGKILL);
assertThrown!ProcessException(kill(pid)); assertThrown!ProcessException(kill(pid)); // Already terminated
} }
@system unittest // wait() and kill() detached process @system unittest // wait() and kill() detached process