| PGRAB(3PROC) | Process Control Library Functions | PGRAB(3PROC) |
Pgrab — grab and
control a process
Process Control Library (libproc, -lproc)
#include
<libproc.h>
struct ps_prochandle *
Pgrab(pid_t pid,
int flags, int *perr);
The
Pgrab()
function attempts to grab the process identified by
pid and returns a handle to it that allows the process
to be controlled, interrogated, and manipulated. This interface only works
with processes that already exist. Use
Pgrab_core(3PROC) for core
files and Pcreate(3PROC) to
create processes.
A grabbed process undergoes the following changes unless flags is set to the contrary:
PR_RLC
flag is set indicating the process should run-on-last-close. Allowing the
process to resume running if its controlling process dies.Grabbing a process is a destructive action. Stopping a process stops execution of all its threads. The impact of stopping a process depends on the purpose of that process. For example, if one stops a process that's primarily doing computation, then its computation is delayed the entire time that it is stopped. However, if instead this is an active TCP server, then the accept backlog may fill causing connection errors and potentially connection time out errors.
Special care must be taken to ensure that a stopped process
continues, even if the controlling process terminates. If the controlling
process disables the PR_RLC flag or the process was
already stopped, then the process remains stopped after the controlling
process terminates. Exercise caution when changing this behavior.
Many of these default behaviors can be controlled by passing values to the flags argument. Values for flags are constructed by a bitwise-inclusive-OR of flags from the following list:
PGRAB_RETAINNormally extant tracing flags are cleared when a process is grabbed.
PGRAB_FORCENormally an attempt will be made to grab the process exclusively and fail if it is already in use.
PGRAB_RDONLYPGRAB_RETAIN and
PGRAB_NOSTOP flags should be set. If a process is
opened read-only, then a caller can only read information about a process
and cannot manipulate it, change its current state, or inject systems
calls into it.
Normally when a process is grabbed, it does so for both reading and writing.
PGRAB_NOSTOPPGRAB_RETAIN flag has been set.
Normally a process is stopped as a result of grabbing the process.
The perr argument must be a
non-NULL pointer which will store a more detailed
error in the event that the
Pgrab()
function fails. A human-readable form of the error can be obtained with
Pgrab_error(3PROC).
Once a caller is done with the library handle it should call Prelease(3PROC) to release the grabbed process. Failure to properly release the handle may leave a process stopped and interfere with the ability of other software to obtain a handle.
Unprivileged users may grab and control their own processes only if both the user and group IDs of the target process match those of the calling process. In addition, the caller must have a super set of the target's privileges. Processes with the PRIV_PROC_OWNER privilege may manipulate any process on the system, as long as it has an equal privilege set. For more details on the security and programming considerations, please see the section PROGRAMMING NOTES in proc(5).
Upon successful completion, the Pgrab()
function returns a control handle to the process. Otherwise,
NULL is returned with perr
containing the error code.
The Pgrab() function will fail if:
G_BUSYPGRAB_FORCE flag was not passed in
flags.G_LP64G_NOFDEMFILE.G_NOPROCG_PERMG_SYSG_SELFPGRAB_RDONLY was not passed. A
process may only grab itself if it's read-only.G_STRANGEG_ZOMBerrno(3C), libproc(3LIB), Pfree(3PROC), Pgrab_core(3PROC), Pgrab_error(3PROC), Pgrab_file(3PROC), Prelease(3PROC)
| May 11, 2016 | OmniOS |