Copyright (c) 2004, 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]
cc [ flag.\|.\|. ] file.\|.\|. -D_LARGEFILE64_SOURCE -lcontract [ library.\|.\|. ] #include <libcontract.h> #include <sys/contract/process.h> int ct_pr_event_get_pid(ct_evthdl_t evthdl, pid_t *pidp);
int ct_pr_event_get_ppid(ct_evthdl_t evthdl, pid_t *pidp);
int ct_pr_event_get_signal(ct_evthdl_t evthdl, int *signalp);
int ct_pr_event_get_sender(ct_evthdl_t evthdl, pid_t *pidp);
int ct_pr_event_get_senderct(ct_evthdl_t evthdl, ctid_t *pidp);
int ct_pr_event_get_exitstatus(ct_evthdl_t evthdl, int *statusp);
int ct_pr_event_get_pcorefile(ct_evthdl_t evthdl, char **namep);
int ct_pr_event_get_gcorefile(ct_evthdl_t evthdl, char **namep);
int ct_pr_event_get_zcorefile(ct_evthdl_t evthdl, char **namep);
These functions read process contract event information from an event object returned by ct_event_read(3CONTRACT) or ct_event_read_critical(3CONTRACT).
The ct_pr_event_get_pid() function reads the process ID of the process generating the event.
The ct_pr_event_get_ppid() function reads the process ID of the process that forked the new process causing the CT_PR_EV_FORK event.
The ct_pr_event_get_signal() function reads the signal number of the signal that caused the CT_PR_EV_SIGNAL event.
The ct_pr_event_get_sender() function reads the process ID of the process that sent the signal that caused the CT_PR_EV_SIGNAL event. If the signal's sender was not in the same zone as the signal's recipient, this information is available only to event consumers in the global zone.
The ct_pr_event_get_senderct function reads the contract ID of the process that sent the signal that caused the CT_PR_EV_SIGNAL event. If the signal's sender was not in the same zone as the signal's recipient, this information is available only
The ct_pr_event_get_exitstatus() function reads the exit status of the process generating a CT_PR_EV_EXIT event.
The ct_pr_event_get_pcorefile() function reads the name of the process core file if one was created when the CT_PR_EV_CORE event was generated. A pointer to a character array is stored in *namep and is freed when ct_event_free(3CONTRACT) is called on the event handle.
The ct_pr_event_get_gcorefile() function reads the name of the zone's global core file if one was created when the CT_PR_EV_CORE event was generated. A pointer to a character array is stored in *namep and is freed when ct_event_free() is called on the event handle.
The ct_pr_event_get_zcorefile() function reads the name of the system-wide core file in the global zone if one was created when the CT_PR_EV_CORE event was generated. This information is available only to event consumers in the global zone. A pointer to a character array is stored in *namep and is freed when ct_event_free() is called on the event handle.
Upon successful completion, ct_pr_event_get_pid(), ct_pr_event_get_ppid(), ct_pr_event_get_signal(), ct_pr_event_get_sender(), ct_pr_event_get_senderct(), ct_pr_event_get_exitstatus(), ct_pr_event_get_pcorefile(), ct_pr_event_get_gcorefile(), and ct_pr_event_get_zcorefile() return 0. Otherwise, they return a non-zero error value.
The ct_pr_event_get_pid(), ct_pr_event_get_ppid(), ct_pr_event_get_signal(), ct_pr_event_get_sender(), ct_pr_event_get_senderct(), ct_pr_event_get_exitstatus(), ct_pr_event_get_pcorefile(), ct_pr_event_get_gcorefile(), and ct_pr_event_get_zcorefile() functions will fail if:
EINVAL
The evthdl argument is not a process contract event object.
The ct_pr_event_get_ppid(), ct_pr_event_get_signal(), ct_pr_event_get_sender(), ct_pr_event_get_senderct(), ct_pr_event_get_exitstatus(), ct_pr_event_get_pcorefile(), ct_pr_event_get_gcorefile(), and ct_pr_event_get_zcorefile() functions will fail if:
EINVAL
The requested data do not match the event type.
The ct_pr_event_get_sender()a functions will fail if:
ENOENT
The process ID of the sender was not available, or the event object was read by a process running in a non-global zone and the sender was in a different zone.
The ct_pr_event_get_pcorefile(), ct_pr_event_get_gcorefile(), and ct_pr_event_get_zcorefile() functions will fail if:
ENOENT
The requested core file was not created.
The ct_pr_event_get_zcorefile() function will fail if:
ENOENT
The event object was read by a process running in a non-global zone.
Example 1 Print the instigator of all CT_PR_EV_SIGNAL events.
Open the process contract bundle. Loop reading events. Fetch and display the signalled pid and signalling pid for each CT_PR_EV_SIGNAL event encountered.
#include <sys/types.h> #include <fcntl.h> #include <stdio.h> #include <libcontract.h> ... int fd; ct_evthdl_t event; pid_t pid, sender; fd = open("/system/contract/process/bundle", O_RDONLY); for (;;) { ct_event_read(fd, &event); if (ct_event_get_type(event) != CT_PR_EV_SIGNAL) { ct_event_free(event); continue; } ct_pr_event_get_pid(event, &pid); if (ct_pr_event_get_sender(event, &sender) == ENOENT) printf("process %ld killed by unknown process\en", (long)pid); else printf("process %ld killed by process %ld\en", (long)pid, (long)sender); ct_event_free(event); } ...
See attributes(5) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Interface Stability | Evolving |
MT-Level | Safe |
ct_event_free(3CONTRACT), ct_event_read(3CONTRACT), ct_event_read_critical(3CONTRACT), libcontract(3LIB), contract(4), process(4), attributes(5), lfcompile(5)