kill function in linux
The kill function sends a signal to a process or a group
of processes. The raise function allows aprocess to send a signal to itself.
raise was originally defined by ISO C. POSIX.1 includes
it to align itself with the ISO C standard, but POSIX.1 extends the
specification of raise to deal with threads (we discuss how threads interact
with signals in Section 12.8). Since ISO C does not deal with multiple processes,
it could not define a function, such as kill, that requires a process ID
argument.
#include <signal.h>
int kill(pid_t pid, int signo);
int raise(int signo);
Return:
Both return: 0 if OK, 1 on error
The call
raise(signo);
is equivalent to the call
kill(getpid(), signo);
There are four different conditions for the pid argument
to kill.
pid > 0
|
The signal is sent to the process whose process ID is pid.
|
pid == 0
|
The signal is sent to all processes whose process group
ID equals the process group ID of the sender and for which the sender has
permission to send the signal. Note that the term all processes excludes an
implementation-defined set of system processes. For most UNIX systems, this
set of system processes includes the kernel processes and init (pid 1).
|
pid < 0
|
The signal is sent to all processes whose process group
ID equals the absolute value of pid and for which the sender has permission
to send the signal. Again, the set of all processes excludes certain system
processes, as described earlier.
|
pid == 1
|
The signal is sent to all processes on the system for
which the sender has permission to send the signal. As before, the set of
processes excludes certain system processes.
|
As we've mentioned, a process needs permission to send a
signal to another process. The superuser can send a signal to any process. For other users, the
basic rule is that the real or effective user ID of the sender has to equal the real or effective user ID of
the receiver. If the implementation supports
_POSIX_SAVED_IDS
(as POSIX.1 now requires), the saved set-user-ID of the receiver is
checked instead of its effective user ID. There is also one
special case for the permission testing: if the signal being sent is SIGCONT, a process can send it to any other process in
the same session.
POSIX.1 defines signal number 0 as the null signal. If
the signo argument is 0, then the normal error checking is performed by kill, but no signal is sent. This is often
used to determine if a specific process still exists. If we send the process the null
signal and it doesn't exist, kill
returns 1 and errno
is set to ESRCH.
Be aware, however, that UNIX systems recycle process IDs after some amount of
time, so the existence of a process with a given process ID does not mean that
it's the process that you think it is.
Also understand that the test for process existence is
not atomic. By the time that kill
returns the answer to the caller, the process in question might have
exited, so the answer is of limited value.
If the call to kill causes the signal to be generated for the calling
process and if the signal is not blocked, either signo or some other pending,
unblocked signal is delivered to the process before kill returns. (Additional conditions
occur with threads)
No comments:
Post a Comment