xref: /illumos-gate/usr/src/man/man3cpc/pctx_set_events.3cpc (revision eb9a1df2aeb866bf1de4494433b6d7e5fa07b3ae)
te
Copyright (C) 2003, Sun Microsystems, Inc. All Rights Reserved.
The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
PCTX_SET_EVENTS 3CPC "May 13, 2003"
NAME
pctx_set_events - associate callbacks with process events
SYNOPSIS

cc [ flag... ] file... -lpctx [ library... ]
#include <libpctx.h>

typedef enum {
 PCTX_NULL_EVENT = 0,
 PCTX_SYSC_EXEC_EVENT,
 PCTX_SYSC_FORK_EVENT,
 PCTX_SYSC_EXIT_EVENT,
 PCTX_SYSC_LWP_CREATE_EVENT,
 PCTX_INIT_LWP_EVENT,
 PCTX_FINI_LWP_EVENT,
 PCTX_SYSC_LWP_EXIT_EVENT
} pctx_event_t;

typedef int pctx_sysc_execfn_t(pctx_t *pctx, pid_t pid, id_t lwpid,
 char *cmd, void *arg);

typedef void pctx_sysc_forkfn_t(pctx_t *pctx,
 pid_t pid, id_t lwpid, pid_t child, void *arg);

typedef void pctx_sysc_exitfn_t(pctx_t *pctx, pid_t pid, id_t lwpid,
 void *arg);

typedef int pctx_sysc_lwp_createfn_t(pctx_t *pctx, pid_t pid, id_t lwpid,
 void *arg);

typedef int pctx_init_lwpfn_t(pctx_t *pctx, pid_t pid, id_t lwpid,
 void *arg);

typedef int pctx_fini_lwpfn_t(pctx_t *pctx, pid_t pid, id_t lwpid,
 void *arg);

typedef int pctx_sysc_lwp_exitfn_t(pctx_t *pctx, pid_t pid, id_t lwpid,
 void *arg);

int pctx_set_events(pctx_t *pctx...);
DESCRIPTION

The pctx_set_events() function allows the caller (the controlling process) to express interest in various events in the controlled process. See pctx_capture(3CPC) for information about how the controlling process is able to create, capture and manipulate the controlled process.

The pctx_set_events() function takes a pctx_t handle, followed by a variable length list of pairs of pctx_event_t tags and their corresponding handlers, terminated by a PCTX_NULL_EVENT tag.

Most of the events correspond closely to various classes of system calls, though two additional pseudo-events (init_lwp and fini_lwp) are provided to allow callers to perform various housekeeping tasks. The init_lwp handler is called as soon as the library identifies a new LWP, while fini_lwp is called just before the LWP disappears. Thus the classic "hello world" program would see an init_lwp event, a fini_lwp event and (process) exit event, in that order. The table below displays the interactions between the states of the controlled process and the handlers executed by users of the library.

System Calls and pctx Handlers
System call Handler Comments
exec,execve fini_lwp
Invoked serially on all lwps in the process.
exec
Only invoked if the exec() system call succeeded.
init_lwp
If the exec succeeds, only invoked on lwp 1. If the exec fails, invoked serially on all lwps in the process.
fork, vfork, fork1 fork
Only invoked if the fork() system call succeeded.
exit fini_lwp Invoked on all lwps in the process.
exit Invoked on the exiting lwp.

Each of the handlers is passed the caller's opaque handle, a pctx_t handle, the pid, and lwpid of the process and lwp generating the event. The lwp_exit, and (process) exit events are delivered before the underlying system calls begin, while the exec, fork, and lwp_create events are only delivered after the relevant system calls complete successfully. The exec handler is passed a string that describes the command being executed. Catching the fork event causes the calling process to fork(2), then capture the child of the controlled process using pctx_capture(\|) before handing control to the fork handler. The process is released on return from the handler.

RETURN VALUES

Upon successful completion, pctx_set_events(\|) returns 0. Otherwise, the function returns -1.

EXAMPLES

Example 1 HandleExec example.

This example captures an existing process whose process identifier is pid, and arranges to call the HandleExec routine when the process performs an exec(2).

static void
HandleExec(pctx_t *pctx, pid_t pid, id_t lwpid, char *cmd, void *arg)
{
 (void) printf("pid %d execed '%s'\en", (int)pid, cmd);
}
int
main()
{
 ...
 pctx = pctx_capture(pid, NULL, 1, NULL);
 (void) pctx_set_events(pctx,
 PCTX_SYSC_EXEC_EVENT, HandleExec,
 ...
 PCTX_NULL_EVENT);
 (void) pctx_run(pctx, 0, 0, NULL);
 pctx_release(pctx);
}
ATTRIBUTES

See attributes(5) for descriptions of the following attributes:

ATTRIBUTE TYPE ATTRIBUTE VALUE
Interface Stability Evolving
MT-Level Unsafe
SEE ALSO

exec(2), exit(2), fork(2), vfork(2), fork1(2), cpc(3CPC), libpctx(3LIB), proc(4), attributes(5)