summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-03-28 19:30:33 +0000
committerRoland McGrath <roland@gnu.org>1996-03-28 19:30:33 +0000
commit8c1442d02fa18a1f008fab7f96ebec9abaec589b (patch)
tree88a9d25ea65a94c6d3310ceb03e16f7225d64a35 /sysdeps
parent43efc1033385fe355baffb0592d90653aeb47fd2 (diff)
downloadglibc-8c1442d02fa18a1f008fab7f96ebec9abaec589b.tar.gz
Thu Mar 28 14:22:51 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* sysdeps/mach/hurd/kill.c: If proc_pid2task gives us MACH_PORT_NULL the process is a zombie; send no messages and return success.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/mach/hurd/kill.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sysdeps/mach/hurd/kill.c b/sysdeps/mach/hurd/kill.c
index 9227f2243f..1f10613b09 100644
--- a/sysdeps/mach/hurd/kill.c
+++ b/sysdeps/mach/hurd/kill.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -50,7 +50,8 @@ __kill (pid_t pid, int sig)
{
task_t refport;
err = __proc_pid2task (proc, pid, &refport);
- if (!err)
+ /* Ignore zombies. */
+ if (!err && refport != MACH_PORT_NULL)
{
err = __task_terminate (refport);
__mach_port_deallocate (__mach_task_self (), refport);
@@ -73,6 +74,12 @@ __kill (pid_t pid, int sig)
/* If we could not get the task port, we can do nothing. */
return taskerr;
+ if (refport == MACH_PORT_NULL)
+ /* proc_pid2task returned success with a null task port.
+ That means the process is a zombie. Signals
+ to zombies should return success and do nothing. */
+ return 0;
+
/* For user convenience in the case of a task that has
not registered any message port with the proc server,
translate a few signals to direct task operations. */
@@ -85,6 +92,7 @@ __kill (pid_t pid, int sig)
return __task_suspend (refport);
case SIGCONT:
return __task_resume (refport);
+ case SIGTERM:
case SIGQUIT:
case SIGINT:
return __task_terminate (refport);
@@ -111,7 +119,7 @@ __kill (pid_t pid, int sig)
/* Send SIG to each process in pgrp (- PID). */
pid_t pidbuf[10], *pids = pidbuf;
mach_msg_type_number_t i, npids = sizeof (pidbuf) / sizeof (pidbuf[0]);
-
+
err = __proc_getpgrppids (proc, - pid, &pids, &npids);
if (!err)
{