 |
Index for Section 4 |
|
 |
Alphabetical listing for P |
|
 |
Bottom of page |
|
proc(4)
NAME
proc - The process (/proc) file system and associated ioctl requests
SYNOPSIS
/proc
DESCRIPTION
The /proc file system is layered beneath the Virtual File System (VFS). It
is a pseudo-file system that occupies no disk space. The /proc pseudo-file
system appears to contain files, but these are actually running processes.
The /proc file system enables running processes to be accessed as files by
the open(), close(), read(), write(), lseek(), poll()/select(), and ioctl()
system calls. This allows any process with the correct permissions to
control another running process. The /proc file system is most useful for
debuggers because a parent/child relationship does not have to exist
between a debugger and the process that is being debugged.
For each active or zombie process, there is an entry in the system process
table, which appears as a file name in the /proc directory. The file name
is the decimal representation of the process ID. File names are padded
with leading zeros (0) so that each file name is a minimum of 5 decimal
digits. For example, if a process has a process ID of 123, its file name
appears as 00123. However, you do not have to include the leading zeros
when specifying the file name. For example, specifying ls -l /proc/123 is
acceptable.
The only files that appear to exist in the /proc directory correspond to
valid (active or zombie) processes in the system proc table. Other than by
creating or terminating a process, you cannot create or remove files in the
/proc directory. The permissions for a file in the /proc directory are
0600, which indicates read and write permissions for the owner only. The
uid and gid values for a file in the /proc directory are the uid and gid
values of the user who is running the process.
Setting Up the /proc File System
You can use the mount and umount commands to manually mount and unmount the
file system, or you can define an entry for the /proc file system in the
system's /etc/fstab file.
To mount the /proc file system by using the mount command, enter the
following:
mount -t procfs /proc /proc
Alternatively, you can add the following entry to the /etc/fstab file to
let the /proc file system be mounted automatically at startup:
/proc /proc procfs rw 0 0
To unmount the /proc file system, use the umount command as follows:
umount /proc
Security Considerations
All auditing requirements for the /proc file system are handled by the
Virtual File System (VFS). The root user, or superuser, can open all
processes by using the /proc file system. A nonprivileged user can open an
active process only if the following conditions are met:
· Both the uid and gid of the user match those of the running process.
· The user has read permission for the executable file from which the
active process was created.
· The executable file from which the active process was created must not
have setuid or setgid permission unless one of the following is true:
-- The user who executed the file has root or SEC_DEBUG privilege
established.
-- The user's UID or GID (for setuid() or setgid() permission,
respectively) matches that of the file.
If a debugging process opens an active process and the active process uses
an exec call to start another image that has suid or sgid permissions, or
if the debugging process does not have read permission for the image that
the active process invokes, the debugging process is denied access to the
process information for the new image (with the exception of a close()
operation). This is also true for the root user or users with superuser
privileges.
Manipulating Processes: System Calls and ioctl Requests
Files are manipulated using the open(), close(), read() write(),
poll()/select(), and ioctl() system calls. Once a process has been opened,
its user virtual address space can be examined or written by using the
lseek() system call, followed by the read() or write() system call.
Likewise, as long as a process is opened for both read and write, the
ioctl() operations can be used to control, trace, or get status for a
process that has been opened. The close() system call should be used when
interaction with a process is complete.
Note
Any number of opens for read and write are allowed; however, to
prevent confusion, if several processes are trying to control another
process, an exclusive open for write access can be requested. An open
for write access that includes the O_EXCL specifier only succeeds if
the file is not already open for write access. An open for write
access that does not specify O_EXCL always succeeds for the root or
otherwise privileged user. There can be any number of read-only
opens, even when an exclusive open for write access is in effect on
the file.
When a file is closed, any tracing flags that were set are left on, unless
the Run on Last Close (RLC) flag was set by an ioctl() call. If RLC is set,
and the last writable file descriptor pertaining to the process is closed,
all tracing flags are cleared, and the process is set to run (if it was
stopped). Breakpoints are not affected by the RLC flag because breakpoints
are written into the text area of a running process by a debugger; the
debugger is therefore always responsible for replacing the original
instructions.
Information and control operations are provided through the ioctl() system
call. The operations have the form:
#include <sys/types.h> #include <sys/signal.h> #include <sys/fault.h>
#include <sys/syscall.h> #include <sys/procfs.h>
ioctl(fd, request, p);
The p argument is a generic pointer whose use depends on the specified
ioctl request. When p is not mentioned in a request description, the
corresponding call argument should be zero. The <sys/procfs.h> header file
contains ioctl request definitions and the data structures used by the
requests. Certain requests, including all that affect process control, can
be performed on a process file only if it is open for writing.
Process and control operations involve the use of a set of flags. The
sigset_t, fltset_t, and sysset_t set types are masks. The values used to
set these masks correspond respectively to the signal, fault, and system
call numbers that are defined in <sys/signal.h>, <sys/fault.h>, and
<sys/syscall.h>. Each set type is large enough to hold the masks bits for
all legal values of the related action. Although they are of different
sizes, they have a common structure and can be manipulated by the following
macros:
prfillset(&set); /* turns on all flags in set */
premptyset(&set); /* turns off all flags in set */
praddset(&set,flag); /* turns on a specified flag */
prdelset(&set,flag); /* turns off a specified flag */
r = prismember(&set,flag); /* returns true if the flag is on */
Either prfillset() or premptyset() must be used to initialize set before it
is used in any operation. The flag argument must be a member of the
enumeration that corresponds to the set.
IOCTL REQUESTS
The process ioctl requests are divided into eight groups: process
information and control, signal interaction, fault trap interaction, system
call interaction, traced process control, general registers, miscellaneous
mapping control, and some requests specific to Tru64 UNIX. The following
subsections describe the requests in these groups.
ioctl Requests for Process Information and Control
The following requests specify process requests:
PIOCSTATUS
Returns status information for the process. The p argument points to the
prstatus structure, key members of which are as follows:
long pr_flags; /* specifies process flags */
short pr_why; /* reason process is stopped */
long pr_what; /* specifies detailed reasons */
struct siginfo pr_info; /* data related to signal or fault */
short pr_cursig; /* specifies current signal */
sigset_t pr_sigpend; /* set of other pending signals */
sigset_t pr_sighold; /* set of held signals */
struct sigaltstack pr_altstack; /* alternate signal stack data */
struct sigaction pr_action; /* signal action of current signal */
pid_t pr_pid; /* specifies process id */
pid_t pr_ppid; /* specifies parent process id */
pid_t pr_pgrp; /* specifies group process id */
pid_t pr_sid /* specifies session id */
timestruc_t pr_utime; /* specifies process user cpu time */
timestruc_t pr_stime; /* specifies process system cpu time */
timestruc_t pr_cutime; /* sum child processes user time */
timestruc_t pr_cstime; /* sum child processes system time */
char pr_clname[8]; /* scheduling class name */
gregset_t pr_reg; /* specifies general registers */
long pr_nthreads; /* number of threads */
tid_t pr_tid; /* thread id output by PIOCSTATUS */
The following flags can be included in the pr_flags bit-mask:
· PR_STOPPED specifies that the process is stopped.
· PR_ISTOP specifies that the process stopped on an event of interest.
(See the description of the PIOCSTOP request.)
· PR_DSTOP specifies that the process will stop before entering user
code. (See the description of the PIOCSTOP request.)
· PR_ASLEEP specifies that a process is in an interruptible sleep within
a system call.
· PR_RLC specifies that a process has its run-on-last-close flag set.
· PR_PTRACE specifies that a process is being traced by ptrace().
· PR_PCINVAL specifies that a process program counter refers to an
invalid address.
· PR_ISSYS specifies that a process is a system process. (See the
description of the PIOCSTOP request.)
pr_why and pr_what
The pr_why and pr_what fields describe why a process is stopped and what
stopped it. The possible values for pr_why follow. Included in the
description of the pr_why values is an explanation of what pr_what holds.
The pr_why values are:
· PR_REQUESTED indicates that a PIOCSTOP request was specified, hence
the process was stopped. In this instance, the pr_what field is not
used.
· PR_SIGNALLED indicates that a process stopped upon receiving a signal.
See the description of the PIOCSTRACE request.) In this case, the
pr_what field holds the signal number that caused the process to stop.
If this is a newly stopped process, the signal number is placed in the
pr_cursig field.
· PR_FAULTED specifies that a process stopped upon encountering a fault.
(See the description of the PIOCSFAULT request.) In this case, the
pr_what field holds the number of the fault that stopped the process.
· PR_SYSENTRY and PR_SYSEXIT specify that a stop is to occur on an entry
to or an exit from a system call. (See the descriptions of the
PIOCSENTRY and PIOCSEXIT requests.) In this case, the pr_what field
holds the number of the system call, including the habitat number, if
any.
· PR_JOBCONTROL specifies that a process stopped because of the default
action that was specified by a job control stop signal. (See
sigaction()). In this case, the pr_what field holds the stopping
signal's number.
· PR_DEAD specifies that a process has terminated. At this point, the
process and memory context are considered invalid. In this case, the
pr_what field holds the exist status of the process. This allows a
debugger to determine that the process being debugged has terminated
and to see its exit status. See also ioctl(2).
pr_info
The pr_info member of the prstatus structure is a structure that contains
additional information specific to a signal or a fault when a process is
stopped with either PR_SIGNALLED or PR_FAULTED in the pr_why field. See the
<sys/siginfo.h> header file for details about the pr_info structure.
pr_cursig
This field identifies the number of the next signal to be delivered to a
process.
pr_sigpend
This field is a mask of pending signals that are to be sent to a process.
pr_sighold
This field is a mask of those signals whose delivery will be delayed if
sent to a process. Note that this mask is 0 to (N-1), as opposed to
pr_sigpend mask, which is 1 to N, where N is the maximum signal number.
pr_altstack
The field provides alternate signal stack information for a process. (See
sigaltstack(2).)
pr_action
The field contains any signal action related to the current signal. (See
sigaction(2).) The signal action is not returned if the pr_cursig field is
zero.
pr_pid
This field contains the process identification number.
pr_ppid
This field contains the process identification number of the parent
process.
pr_pgrp
This field contains the group identification number of the process.
pr_sid
This field contains the session identification number of the process.
pr_utime and pr_stmine
These fields contain the user and system time (in seconds and nanoseconds)
used by the process.
pr_cutime and pr_cstime
These fields contain the cumulative user and system time (in seconds and
nanoseconds) used by the child processes of the specified process.
pr_clname
This field contains the name of the scheduling class that the process is
using.
pr_reg
This array contains the contents of the general registers for the thread
specified by the pr_tid field. For a single-threaded process, this is the
first thread.
pr_nthreads
This field contains the number of threads currently in the process (task).
pr_tid
If the process is stopped on an event of interest, the pr_tid field
contains the thread ID of the thread that encountered the process (task)
trace event. NOTE: In a multithreaded task, the PIOCSTOP request sets
pr_tid to the thread ID of the first thread and sets the registers in the
pr_reg field accordingly.
PIOCSTOP and PIOCWSTOP
The PIOCSTOP request requires write access to the process file. This
request specifies that a process stop on an event of interest and remains
in effect until the process does stop. The PIOCWSTOP request waits for a
process to stop on an event of interest. For both requests, if the p
argument is a nonzero value, it points to a prstatus_t structure that holds
status information on the stopped process.
If PIOCSTOP is specified for a process that is already stopped, but not
stopped on an event of interest, the stop directive takes affect only when
the process is restarted by the competing mechanism, and before executing
any user-level code.
An event of interest occurs when either a PR_REQUESTED stop was specified
in the pr_why field or a stop was specified in a tracing flag of a process
by the PIOCSTRACE, PIOCSFAULT, PIOCSENTRY, or PIOCSEXIT request. A
PR_JOBCONTROL flag is not considered an event of interest.
A system process (indicated by the PR_ISSYS flag) never executes at user
level, does not have a user-level address space visible through the /proc
file system, and cannot be stopped. Applying PIOCSTOP or PIOCWSTOP to a
system process returns the error [EBUSY].
PIOCDUMPCORE
The PIOCDUMPCORE request generates a core snapshot of the traced process,
suitable for use with debuggers. This request does not kill or otherwise
perturb the process in any way, as would be the case when sending it a
signal. The process must be stopped (typically with PIOCSTOP or PIOCWSTOP).
If the process is not stopped, [EBUSY] is returned. Optionally, the caller
can use setsysinfo(SSI_COREDIR) to specify a directory in which to dump the
core image. Otherwise, the core image is dumped to the current directory of
the caller.
To use the PIOCDUMPCORE request, the caller must have read permission to
the process being dumped and write permission to the directory in which the
core image is dumped.
PIOCRUN
The PIOCRUN request starts a traced process again after it has been
stopped. This request requires write access on the process file. PIOCRUN
fails with an [EBUSY] error if it is applied to a process that is not
stopped on an event of interest, even when the process is stopped due to a
competing mechanism. The p argument points to a prrun structure that
provides additional directives or actions that can be performed:
typedef struct prrun {
long pr_flags; /* specifies process flags */
sigset_t pr_trace; /* specifies set of signals to trace */
sigset_t pr_sighold; /* specifies set of signals to hold */
fltset_t pr_fault; /* specifies set of faults to trace */
caddr_t pr_vaddr; /* specifies virtual address at which to resume */
long pr_filler[8]; /* filler area for future expansion */
tid_t pr_tid; /* Thread to resume for PIOCTRUN, ignored by PIOCRUN */
} prrun_t;
The members of the prrun structure are only meaningful if the appropriate
flags are set in the pr_flags field. The pr_flags bit-mask has the
following flags:
· PRCSIG specifies that the current signal, if any, be cleared. (See the
description of the PIOCSSIG request.)
· PRCFAULT specifies that the current fault, if any, be cleared. (See
the description of the PIOCCFAULT request.)
· PRSTRACE specifies that the traced signal set is set to the value of
the pr_trace field. (See the description of the PIOCSTRACE request.)
· PRSHOLD specifies that the held signal set is set to the value of the
pr_sighold. (See the description of the PIOCSHOLD request.)
· PRSFAULT specifies that the traced fault set is set to the value of
the pr_fault field. (See the description of the PIOCSFAULT request.)
· PRSVADDR specifies the address at which execution resumes to the value
of the pr_vaddr field.
· PRSTEP tells the process to run and to execute a single machine
instruction. When execution has completed, a hardware trace trap
occurs. If FLTTRACE is being traced, the process stops on the fault;
otherwise, a SIGTRAP is posted. If SIGTRAP is being traced and not
held, the process stops on the signal. The PRSTEP implementation
requires hardware and operating system support and might not be
available on all systems.
· PRSABORT specifies that the process is to abort execution of the
current system call if the process is in a PR_SYSENTRY stop or is
marked by the PR_ASLEEP flag in the pr_flags bitmask. (See the
descriptions of the PIOCSENTRY and PIOCEXIT requests.)
· PRSTOP specifies that a process stop again soon after it has resumed
execution. (See the description of the PIOCSTOP request.)
Specifically, when a process is stopped with PR_SIGNALLED or
PR_FAULTED in the pr_why field, the next stop displays PR_REQUESTED in
the pr_what field. In this case, no other stop can intervene, and the
process will not have executed any user-level code.
PIOCSRLC
The PIOCSRLC request sets the run-on-last-close flag in the traced process.
When the last writable /proc file descriptor that refers to the traced
process is closed, all of the process's tracing flags are cleared, any
outstanding stop directive is canceled, and (if the process is stopped) the
process is set running as though a PIOCRUN request had been applied to it.
The PIOCSRLC request requires write access on the process file. The run-
on-last-close flag is off by default.
PIOCRRLC
The PIOCRRLC request sets the run-on-last-close flag to off. The tracing
flags of a process are retained, and the process is not restarted when the
process file is closed. This request requires write access on the process
file.
PIOCNICE
The PIOCNICE request increments a traced process's nice priority by the
amount contained in the int value addressed by the p argument. Only the
superuser can better the priority of a process in this manner, but any user
can make the priority worse.
ioctl Requests for Signal Interaction
The following requests specify signal interaction:
PIOCSTRACE
The PIOCSTRACE request defines a set of signals to be traced. The receipt
of one of these signals causes the traced process to stop. The set of
signals is defined through the sigset_t structure that is pointed to by the
p argument. Receipt of SIGKILL cannot be traced. This request requires
write access on the process file.
If a signal that is included in the held signal set is sent to the traced
process, the signal is not received and does not cause the process to stop
until the signal is removed from the held signal set. The signal can be
removed from the held set either by the process itself, by setting the held
signal set with the PIOCSHOLD request, or by using the PRSHOLD option
defined by the PIOCRUN request.
PIOCGTRACE
The PIOCGTRACE request returns the current traced signal set in an instance
of the sigset_t structure pointed to by the p argument.
PIOCSSIG
The PIOCSSIG request sets the current signal and its associated signal
information according to the contents of the siginfo structure addressed by
the p argument. (See the <sys/siginfo.h> file for the structure
definition.) If the specified signal number is zero or if the p argument
is zero, the current signal is cleared. This request requires write access
on the process file.
The [EBUSY] error is returned if the process is not stopped on an event of
interest. The semantics of this request are different from those of the
kill() function or the PIOCKILL request in that the signal is delivered to
the process immediately after execution is resumed (even if the signal is
being held). Furthermore, an additional PR_SIGNALLED stop does not
intervene, even if the signal is traced. Setting the current signal to
SIGKILL terminates the process immediately, even if it is stopped.
PIOCKILL
The PIOCKILL request sends a signal to the process with semantics identical
to those of the kill() function. The p argument points to a buffer of type
int that names the signal. Sending a SIGKILL signal terminates the process
immediately. This request requires write access on the process file.
PIOCUNKILL
The PIOCUNKILL request deletes a signal (removes it from the set of pending
signals). The current signal, if any, is unaffected. The p argument points
to a buffer of type int that names the signal. When using this request, an
attempt to delete the SIGKILL signal is an error. The current signal is
unaffected. This request requires write access on the process file.
PIOCGHOLD
The PIOCGHOLD request returns the set of held signals (signals whose
delivery is delayed if sent to the process) in an instance of the sigset_t
type addressed by the p argument. Signal number 0 is always returned if
not held.
PIOCSHOLD
The PIOCSHOLD request sets the held signal set. The SIGKILL and stop
signals cannot be held. If specified, they are silently ignored. The
request requires write access on the process file. (See the description of
the PIOCGHOLD request.) Signal number 0 cannot be held; it is ignored if
specified.
PIOCMAXSIG
The PIOCMAXSIG request, along with the PIOCACTION request, provides
information about the signal actions associated with the traced process.
(See sigaction(2).) In the int value returned by the p argument, this
request retrieves the maximum signal number understood by the system. This
number must be obtained to allocate the storage used with the PIOCACTION
request.
PIOCACTION
The PIOCACTION request, along with the PIOMAXSIG request, provides
information about the signal actions associated with the traced process.
PIOCACTION returns the traced process's signal actions in an array of
sigaction structures addressed by the p argument. Signal numbers are
displaced by 1 from array indices, so that the action for signal number n
appears in position n-1 of the array. Note that the PIOCMAXSIG request
must be used prior to using the PIOCACTION request.
See sigaction(2) for the definition of the sigaction structure.
ioctl Requests for Fault Trap Interaction
The following requests specify fault trap interaction:
PIOCSFAULT
ThePIOCSFAULT request defines a set of hardware faults to be traced. When
incurring one of these faults, the traced process stops. This request
requires write access on the process file. The set of hardware faults is
defined by using an instance of type fltset_t addressed by the p argument:
typedef struct { unsigned long word[FLTSET_SZ]; } fltset_t;
The following supported fault names are defined in the <sys/fault.h> file:
· FTTILL specifies an illegal instruction
· FLTPRIV specifies a privileged instruction
· FLTBPT specifies a breakpoint trap
· FLTTRACE specifies a trace trap
· FLTACCESS specifies a memory access fault
· FLTBOUNDS specifies a memory bounds violation
· FLTIOVF specifies an integer overflow
· FLTIZDIV specifies an integer zero divide
· FLTFPE specifies a floating-point exception
· FLTSTACK specifies an unrecoverable stack fault
· FLTPAGE specifies a recoverable page fault
· FLTALIGN specifies an unaligned access fault
Some of these fault names may be identical on some processors and some
names may not occur on all processors. Furthermore, there may be
processor-specific fault names that are not listed here.
When not traced, a fault normally results in the posting of a signal to the
process that incurred the fault. If the process stops on a fault, the
signal is posted to the process when execution is resumed, unless the fault
is cleared by the PIOCCFAULT request or by the PRCFAULT option of the
PIOCRUN request. The FLTPAGE and FLTALIGN faults are exceptions. No signal
is posted after a FLTPAGE fault. A signal may or may not be posted after a
FLTALIGN fault, depending on operating system support. There may be
additional processor-specific faults that behave in this way. The pr_info
structure member in the prstatus structure identifies the signal to be sent
and contains machine-specific information about the fault.
PIOCGFAULT
The PIOCGFAULT request returns the current traced fault set in the fltset_t
structure that is pointed to by the p argument.
PIOCCFAULT
The PIOCCFAULT request clears the current fault (if any), and the
associated signal is not sent to the process. This request requires write
access to the process file.
ioctl Requests for System Call Interaction
The following requests specify system call interaction:
PIOCSENTRY
The PIOCSENTRY request instructs the process to stop on entry to the
specified system calls. The set of system calls to be traced is defined in
the sysset_t structure addressed by the p argument. (See the description
of the PIOCEXIT request for the format of the sysset_t structure.) The
PIOCSENTRY request requires write access to the process file.
When an entry to a system call is being traced, the traced process stops at
beginning of the call to the system.
PIOCSEXIT
The PIOCSEXIT request instructs the process to stop on exit from the
specified system calls. The set of system calls to be traced is defined in
the sysset_t structure addressed by the p argument:
typedef struct {
unsigned long word[SYSSET_SZ]; } sysset_t;
This request requires write access to the process file.
When exit from a system call is being traced, the traced process stops on
completion of the system call after return values are stored into the
traced process's saved registers.
If the traced process is stopped on an entry to a system call (a
PR_SYSENTRY value in the pr_why field), or if the process is in an
interruptible system call (with PR_ASLEEP set), the process may be
instructed to go directly to system call exit by specifying the PRSABORT
flag in a PIOCRUN request. Unless exit from the system call is being
traced, the process returns to the user level with the [EINTR] error.
Note
An exec system call can fail after a new image has been loaded
partially, and the old memory context has been destroyed. When that
happens, the traced process will exit without stopping on exit from
the exec system call.
PIOCGENTRY
The PIOCGENTRY request returns the entry of the currently traced system
call in the sysset_t structure pointed to by the p argument.
PIOCGEXIT
The PIOCGEXIT request returns the exit set of the currently traced system
call in the sysset_t structure pointed to by the p argument.
ioctl Requests for Traced Process Control
The following requests specify traced process control:
PIOCSFORK
The PIOCSFORK request sets the inherit-on-fork-flag in the traced process.
The tracing flags of a process are inherited by the child of a fork() or
vfork() call. This request requires write access on the process file.
PIOCRFORK
The PIOCRFORK request turns the inherit-on-fork flag off. Each child
process starts with all tracing flags cleared. This request requires write
access on the process file.
ioctl Requests for Retrieving and Setting General Registers
The following requests retrieve and set general registers:
PIOCGREG
The PIOCGREG request retrieves the registers of the saved process from the
gregset_t structure that is pointed to by the p argument.
struct gregset {
long regs[PRC_NREGS]; }; typedef struct gregset gregset_t;
The register contents are accessible using a set of predefined indices as
described in the description of the PIOCSTATUS request. Register contents
are set by using the PIOCSREG request.
In a multithreaded process, if the task is not stopped on an event of
interest (a trace event), the PIOCGREG request returns the registers for
the first thread. If the task is stopped on an event of interest, the
registers for the thread that encountered the event are returned. (The
pr_tid field that identifies the thread is returned by the PIOCSTATUS
request and is discussed in the description for that request.)
PIOCSREG
The PIOCSREG request sets the registers of the saved process in the
gregset_t structure pointed to by the p argument. This request requires
write access to the process file. The register contents are accessible
using a set of predefined indices as discussed in the description of the
PIOCSTATUS request.
The PIOCSREG request fails with an [EBUSY] error if applied to a process
that is not stopped on an event of interest.
PIOCGFPREG
The PIOCGFPREG request retrieves the floating-point registers of a saved
process from the fpregset_t structure pointed to by the p argument. The
[EINVAL] error is returned if floating-point hardware is not present on the
machine.
The fpregset_t structure is shown in the description of the PIOCSFPREG
request, which is architecture dependent.
PIOCSFPREG
The PIOCSFPREG request sets the floating-point registers of a saved process
in a fpregset_t structure pointed to by the p argument.
struct fpregset {
long regs[PRC_NREGS]; }; typedef struct fpregset fpregset_t;
The PIOCSFPREG request, which is architecture dependent, requires write
access to the process file. This request returns [EINVAL] if floating-point
hardware is not present on the machine and [EBUSY] if applied to a process
that is not stopped on an event of interest.
Note
The PIOCSREG, PIOCGFPREG, and PIOCSFPREG requests can be used only if
the task is stopped on an event of interest. In a multithreaded task,
the register set that is manipulated is the set associated with the
task that hit the trace event. (See the discussion of the pr_tid
field in the description of the PIOCSTATUS request.) If the task
stopped because of a PIOCSTOP request, the registers are those of the
first thread.
Miscellaneous ioctl Requests
The following requests perform a variety of operations.
PIOCPSINFO
The PIOCPSINFO request returns miscellaneous process information that is
similar to the information returned by the ps command. The p argument is a
pointer to a prpsinfo structure that contains the following key members:
char pr_state: /* numeric process state
* (see pr_sname) */
char pr_sname; /* printable char representing
* pr_state */
char pr_zomb; /* !=0: process terminated
* but not waited for */
char pr_nice; /* nice for cpu usage */
u_long pr_flag; /* process flags */
uid_t pr_uid; /* real user id */
gid_t pr_gid; /* real group id */
pid_t pr_pid; /* unique process id */
pid_t pr_ppid; /* process id of parent*/
pid_t pr_pgrp: /* process id of process group
* leader */
pid_t pr_sid; /* session id */
long pr_size; /* size of process image in
* pages */
long pr_rssize; /* resident set size in pages */
caddr_t pr_wchan; /* wait addr for sleeping
* process */
timestruc_t pr_start; /* process start time,
* sec+nsec since the
* epoch */
timestruc_t pr_time; /* usr+sys time for
* this process */
long pr_pri; /* priority, high value =
* high priority */
char pr_oldpri; /* old style priority,
* low value is high
* priority */
char pr_cpu; * cpu usage for scheduling */
dev_t pr_ttydev; /* controlling tty device
* (PRNODEV if none) */
char pr_clname[8]; /* Scheduling class name */
char pr_fname[16]; /* last component of exec'd
* pathname */
char pr_psargs[PSARGS_SZ]; /* initial characters
* of arg list */
Some fields in the prpsinfo structure, such as the pr_state and the pr_flag
fields, are system specific and may not have the same meaning on each
version of the operating system.
The PIOCPSINFO request can be applied to a process that has become a
zombie; however, in this case, not all fields are filled in.
PIOCUSAGE
The PIOCUSAGE request returns resource usage information about a process.
The p argument is a pointer to a prusage_t structure containing the
following key members:
timestruc_t pr_tstamp; /* current time stamp */
timestruc_t pr_create; /* process creation time stamp */
timestruc_t pr_rtime; /* total real (elapsed) time */
timestruc_t pr_utime; /* user CPU time */
timestruc_t pr_stime; /* system CPU time */
timestruc_t pr_wtime; /* wait-cpu (latency) time */
u_long pr_minf; /* minor page faults */
u_long pr_majf; /* major page faults */
u_long pr_nswap; /* swaps */
u_long pr_inblk; /* input blocks */
u_long pr_oublk; /* output blocks */
u_long pr_msnd; /* messages sent */
u_long pr_mrcv; /* messages received */
u_long pr_vctx; /* voluntary context switches */
u_long pr_ictx; /* involuntary context switches */
u_long pr_ioch; /* chars read and written */
PIOCNMAP
The PIOCNMAP request, like the PIOCMAP request, provides information about
the memory mappings (virtual address ranges) associated with the traced
process. The int value returned by the p argument is the number of
mappings that are currently active. This information can be then used to
allocate additional storage with the PIOCMAP request. In other words, you
use PIOCMAP to allocate space for p+1 mappings.
PIOCMAP
The PIOCMAP request returns the list of currently active mappings. For
PIOCMAP, the p argument addresses an array of elements of type prmap_t; one
array element (structure) is returned for each mapping, with an additional
all-zeros element to mark the end of the list.
typedef struct prmap {
caddr_t pr_vaddr; /* Virtual address base */
u_long pr_size; /* Size of mapping in bytes */
off_t pr_off; /* Offset into mapped object,
* if any */
long pr_mflags; /* Protection and attribute
* flags */
long pr_filler[4]; /* Filler for future expansion */
} prmap_t;
The following list describes the members of the prmap structure:
· The pr_vaddr contains the virtual address base (the lower limit) of
the mapping within the traced process, and the pr_size field contains
its size in bytes. The pr_off field specifies the offset within the
mapped object (if any) to which the address base is mapped.
· The pr_mflags field is a bit-mask of protection and attribute flags as
follows:
MA_READ specifies that the mapping is readable by the traced process
MA_WRITE specifies that the mapping is writable by the traced process
MA_EXEC specifies that the mapping is executable by the traced process
Note
The PIOCNMAP request must be called immediately before the PIOCMAP
request.
PIOCOPENM
If the PIOCOPENM request is called with a NULL value for p, it returns a
read-only file descriptor to the disk file from which the process was
created.
new_fd = ioctl(fd, PIOCOPENM, NULL)
PIOCCRED
The PIOCCRED request obtains the set of credentials associated with the
process. The p argument points to the prcred_t structure where the
information from this operation is placed. The pr_ngroups value determines
the size of the field that the user must allocate and pass to the
PIOCGROUPS request.
typedef struct prcred {
uid_t pr_euid; /* contains effective user id */
uid_t pr_ruid; /* contains real user id */
uid_t pr_suid; /* contains saved user id
* (from exec) */
uid_t pr_egid; /* contains effective group id */
uid_t pr_rgid; /* contains real group id */
uid_t pr_sgid; /* contains saved group id
* (from exec) */
u_int pr_ngroups; /* number of supplementary groups */
} prcred_t;
PIOCGROUPS
The PIOCGROUPS request fetches the set of supplementary group IDs that are
associated with the process. The p argument points to an array of elements
of type uid_t that are to be filled by the operation. Note that the
PIOCCRED request must be applied beforehand to determine the number of
groups (pr_ngroups) that are to be returned and the amount of storage that
should be allocated to hold them.
PIOCSSPCACT
The PIOCSSPCACT request is the ``set special action'' request and requires
write access to the process file. This request is used to enable or disable
tracing of certain process control functions. The p argument contains a
mask that consists of one or more of the following flags. (Note that a zero
value disables all tracing.) The pr_why and pr_what values referred to in
the flag descriptions are the same as those described in the description of
the PIOCSTATUS request.
PRFS_STOPTCR
Sets a condition called stop-on-thread-create. This condition
causes the task in which a new thread is created by a user level
call to thread_create() to stop on an event of interest before the
new thread executes any user level code. The pr_why field is set
to PR_TCRSTOP, and the pr_what field is set to the thread ID of the
newly created thread. The PIOCRUN request should be used to
restart the task. (Note that setting the PRFS_STOPTCR flag does not
cause a task to stop when a fork() system call creates a new
thread.)
PRFS_STOPTTERM
Sets a condition called stop-on-thread-terminate. This will cause a
task to stop when any of its threads enters the kernel
thread_terminate() routine because of a user level call to
thread_terminate(). The pr_why value is set to PR_TTSTOP, and the
pr_what value is set to the thread ID of the terminating thread.
The PIOCRUN request should be used to restart the task. (The last
thread of an exiting process does not cause a task to stop if
stop-on-thread-terminate is set.
PRFS_KOLC
Sets the kill-on-last-close flag in the traced process. This flag
is off by default. If the flag is set, the traced process is
terminated by a SIGKILL signal when the last /proc file descriptor
referring to the traced process is closed. This action occurs even
if the traced process is stopped on a trace event. All further
tracing is disabled. If set, the PRFS_KOLC flag overrides the
run-on-last-close flag. (See also the description of the PIOCSRLC
request.)
PIOCGSPCACT
The PIOCGSPCACT request is the "get special actions" request. It is used
to return, in the address pointed to by the p argument, the latest mask
value that was set by the PIOCSSPCACT request. Programs can use PIOCGSPCACT
to get the current mask setting. They can then OR in bits to be set, AND
out bits to be cleared, or both; the PIOCSSPCACT request can then be called
with the modified mask to affect the desired change in tracing.
PIOCNTHR, PIOCTLIST
The PIOCNTHR and PIOCTLIST requests get a list of all the thread IDs in a
task. The PIOCNTHR request must be called first; it tells the program how
large a buffer must be passed to the PIOCTLIST request and tells the kernel
the maximum number of thread IDs to return through that request. If the
PIOCNTHR request is not called first, the PIOCTLIST request returns the
[EINVAL] error. The PIOCNTHR request includes the p argument as a pointer
to an int value, whereas the PIOCTLIST request includes the p argument as a
pointer to an array of tid_t values (pointers to struct thread). Note that
if the task is not stopped, the actual number of threads in the task may
change in the time between the invocation of PIOCNTHR and PIOCTLIST. The
number of threads returned by PIOCTLIST will always be less than or equal
to the value returned by PIOCNTHR. To work around this problem, the
program can stop the task (by using the PIOCSTOP request, for example)
before invoking PIOCNTHR, and then, after PIOCTLISL completes, restart the
task with PIOCRUN.
An ioctl() call using the PIOCNTHR request has the following format:
ioctl(fd, PIOCNTHR, p)
where p is (int *p)
An ioctl() call using the PIOCTLIST request has the following format:
ioctl(fd, PIOCTLIST, p)
where p is (tid_t p)
See the description of the PIOCTCRAD request for a sample program that
shows use of the PIOCNTHR and PIOCTLIST requests.
PIOCVTOP
The PIOCVTOP request takes a virtual address for a given PID and, if the
page at that address is both in the user map and is resident, returns the
associated physical address and RAD ID. The p argument is a pointer to a
prvtop structure, which has the following definition:
struct prvtop {
caddr_t pr_vaddr; /* user virtual address */
caddr_t pr_paddr; /* physical address */
int pr_radid; /* RAD id where pr_vaddr resides */
int pad1;
long pad2[5];
};
typedef struct prvtop prvtop_t;
The following program fragment shows how to use the PIOCVTOP request:
int
main(int argc, char *argv[])
{
prvtop_t radinfo;
char fname[80];
caddr_t vaddr;
int i;
int fd;
if (argc != 3) {
fprintf(stderr, "Usage: %s pid vaddr\n", argv[0]);
exit(1);
}
sprintf(fname, "/proc/%s", argv[1]);
sscanf(argv[2], "%lx", &vaddr);
printf("fname=%s vaddr=%p\n", fname, vaddr);
fd = open(fname, O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
radinfo.pr_vaddr = vaddr;
radinfo.pr_radid = -1;
radinfo.pr_paddr = NULL;
if (ioctl(fd, PIOCVTOP, &radinfo) < 0) {
perror("ioctl(PIOCVTOP)");
exit(1);
}
printf("0x%016lx (physaddr = 0x%016lx) is in RAD %d\n",
radinfo.pr_vaddr, radinfo.pr_paddr, radinfo.pr_radid);
}
Thread-Specific ioctl Requests
In a multithreaded program, user code must be able to identify which thread
or threads to examine or manipulate. Each user process is composed of a
task, which contains one or more threads. For each thread in a task, the
kernel returns a thread ID to the program through /proc ioctl requests.
Also through /proc ioctl requests, this thread ID is passed from the
program to the kernel to identify which thread in a task to manipulate.
With the exception of the PIOCTLIST request, the thread-specific requests
(PIOCTxxx) can operate on one or more threads. These requests are invoked
in the context of a process, just as the basic process requests are
invoked. For example, if process 123 is opened by using /proc file system:
fd=open("/proc/123", O_RDWR)
then the following call can be used to return status for one or more of its
threads:
ioctl(fd, PIOCTSTATUS, p)
However, unlike the basic requests, which take the address of a fixed
length entity for the p argument, the PIOCTxxx requests use the p argument
to specify the address of a buffer that varies in length, depending on the
number of threads that are to be operated on. In addition, the PIOCTxxx
requests always require a valid p argument because it contains the number
of threads to operate on and their IDs (even when the number is 1).
The struct prthreads structure, which is defined in the <sys/procfs.h>
header file, is used as a common header for each of the PIOCTxxx requests:
struct prthreads {
long pr_count; /* number of threads to operate on
* written by user, read by kernel
*/
tid_t pr_error_thread; /* if error, the ID of the thread
* causing the error is written here
* by the kernel
*/
char pr_data[1]; /* this is a place holder, its
* address is used as the start of
* the list of ioctl specific data
* structures
*/
};
Note
If a thread-specific ioctl() call returns an error status, the ID of
the thread on which the error was detected is returned in the
pr_error_thread field. When the kernel detects an error, ioctl()
processing stops. This means that the request succeeded for all
threads in the specified list that were processed before the thread on
which the error was reported. The request is not attempted for any
threads that remain in the list after the error is detected. If a
failure is encountered that is not related to a specific thread, the
pr_error_thread value is returned as 0.
If a specified thread is not found in the task->thread_list, the
[EBADF] error is returned.
If the pr_count value exceeds the number of threads in the task, the
[EINVAL] error is returned before any of the threads on the specified
list are processed. In this case, the pr_error_thread field is not
updated. (See the description of the PIOCNTHR request for information
on retrieving the thread count value.)
This error behavior applies to all of the PIOCTxxx requests.
PIOCTSTOP, PIOCTSTATUS
The PIOCTSTOP request stops the specified thread (or threads) and returns
status in the specified prstatus structure (or structures). This request
requires write access on the process file. The PIOCTSTATUS request returns
status without stopping the threads.
The PIOCTSTOP and PIOCTSTATUS requests use the same status structure,
prstatus, that is used by the comparable requests (PIOCSTOP and PIOCSTATUS)
in the base request set.
Unlike the case with PIOCSTOP, a prstatus structure is always specified
with PIOCTSTOP. A thread is selected by filling in the pr_tid field of the
prstatus structure pointed to by the p argument. (See the line that refers
to thread_1 in the sample definitions below.)
The ioctl() calls with the PIOCTSTOP and PIOCTSTATUS requests have the
following formats:
ioctl(fd, PIOCTSTOP, p)
ioctl(fd, PIOCTSTATUS, p)
Key definitions for both these requests are as follows:
long pr_count; /* number of threads in list
*/
tid_t pr_error_thread; /* thread ID if error
*/
struct prstatus thread_1; /* "selected" thread is in
* thread_1.pr_tid
*/
.
.
.
struct prstatus thread_N; /* thread_N.pr_tid contains ID of last
* thread to stop (PIOCTSTOP) or the return
* status for (PIOCTSTATUS)
*/
PIOCTRUN
The PIOCTRUN request restarts one or more threads that were stopped by the
PIOCTSTOP request and requires write access on the process file. The
PIOCTRUN request provides the same functionality for threads as the PIOCRUN
request does for the process/task, except that the PRCSIG, PRCFAULT and
PRSHOLD flags of the prrun.pr_flags field are not recognized.
Unlike the case for PIOCRUN, a prrun structure must always be specified for
PIOCTRUN. A thread is selected by filling in the pr_tid field of the prrun
structure. If the prrun.pr_flags field is set to 0, the PIOCTRUN request
does provide the same functionality as the PIOCRUN request with a NULL p
pointer.
If a specified thread is not stopped with PIOCTSTOP, the [EBUSY] error is
returned. If any error is detected while attempting to run a thread: the
ioctl() call returns; any threads in the list before the error will have
been started; any threads in the list after the thread in error will not
have been started.
Note that the PIOCRUN and PIOCTRUN requests, when used with the PRSTEP
flag, can cause the traced program to execute an indefinite number of
instructions if the current instruction is a branch instruction.
The ioctl() arguments with the PIOCTRUN request are as follows:
ioctl(fd, PIOCTRUN, p)
The buffer pointed to by the p argument includes the following key members:
long pr_count; /* number of threads to run
*/
tid_t pr_error_thread; /* set by kernel if error is detected
*/
struct prrun thread_1; /* prrun struct, containing thread ID of
* 1st thread to run in thread_1.pr_tid
*/
.
.
.
struct prrun thread_N; /* prrun.pr_tid contains ID of last
* thread to run in thread_N.pr_tid
*/
PIOCTSSIG
The PIOCTSSIG request allows the ``current signal'' to be cleared or
changed to some other signal, only if the specified thread or threads are
stopped on an event of interest. This request requires write access on the
process file.
The arguments of an ioctl() call using the PIOCTSSIG request are as
follows:
ioctl(fd, PIOCTSSIG, p)
The buffer pointed to by the p argument includes the following key members:
long pr_count; /* number of threads specified
*/
tid_t pr_error_thread; /* thread ID if error
*/
tsiginfo_t thread_1; /* first thread to act on
*/
tsiginfo_t thread_N; /* last thread to act on
*/
The tsiginfo_t structure is defined in <sys/procfs.h> as follows:
typedef struct tsiginfo {
siginfo_t pr_siginfo; /* the actual siginfo structure
*/
tid_t pr_tid; /* the thread ID to act upon
*/
} tsiginfo_t; /* note, this is not a pointer
*/
PIOCTKILL
The PIOCTKILL request allows a signal to be sent to one or more specified
threads. A different signal can be sent to each thread. Sending SIGKILL
kills a thread immediately. This request requires write access on the
process file.
The arguments for an ioctl() call using the PIOCTKILL request are as
follows:
ioctl(fd, PIOCTKILL, p)
The buffer pointed to by the p argument includes the following key members:
long pr_count; /* number of threads specified
*/
tid_t pr_error_thread; /* thread ID if error
*/
tsignal_t thread_1; /* first thread to act on
*/
tsignal_t thread_N; /* last thread to act on
*/
The tsignal_t structure is defined in the <sys/procfs.h> file as follows:
typedef struct tsignal {
int pr_signal; /* the signal to send
*/
tid_t pr_tid; /* the thread ID to act upon
*/
} tsignal_t; /* note, this is not a pointer
*/
PIOCTUNKILL
The PIOCTUNKILL request allows a thread-specific signal that is pending for
a specified thread to be deleted from the list of pending signals. Multiple
threads can be specified, and a different signal can be removed from each
of those threads. The current signals for those threads are unaffected.
This request requires write access on the process file.
The arguments for an ioctl() call using the PIOCTUNKILL request are as
follows:
ioctl(fd, PIOCTUNKILL, p)
The buffer pointed to by the p argument includes the following key members:
long pr_count; /* number of threads specified
*/
tid_t pr_error_thread; /* thread ID if error
*/
tsignal_t thread_1; /* first thread to act on
*/
tsignal_t thread_N; /* last thread to act on
*/
The tsignal_t structure is defined in <sys/procfs.h> as follows:
typedef struct tsignal {
int pr_signal; /* the signal to remove
*/
tid_t pr_tid; /* the thread ID to act upon
*/
} tsignal_t; /* note, this is not a pointer
*/
PIOCTUSAGE
The PIOCTUSAGE request returns resource usage information about a specific
thread in a process. The p argument is a pointer to a prusage_t structure
as described in the description of the PIOCUSAGE request. Additionally, the
following field must be filled in with the desired thread ID (obtained by a
PIOCTLIST request) before the call is made:
tid_t tid; /* Thread ID to get info on */
PIOCTGFPREG, PIOCTSFPREG
The PIOCTGFPREG and PIOCTSFPREG requests are used to get and set the
Floating Point registers for one or more threads and perform the same type
of functions for threads as the PIOCGFPREG and PIOCSFPREG requests do for
the task/process. The PIOCTSFPREG request requires write access to the
process file.
For PIOCTGFPREG, if the floating-point hardware had not been in use
(pcb_ownedfp is NULL), all NULLs are returned. If a specified thread is
not stopped on an event of interest, the [EBUSY] error is returned.
For PIOCTSFPREG, if a specified thread is not stopped on an event of
interest, the [EBUSY] error is returned. No check is made to see if the
floating-point hardware had been in use.
The arguments for an ioctl() call using the PIOCTGFPREG and PIOCTSFPREG
requests are as follows:
ioctl(fd, PIOCTGFPREG, p)
ioctl(fd, PIOCTSFPREG, p)
The buffer pointed to by p argument includes the following key members:
long pr_count; /* number of threads specified
*/
tid_t pr_error_thread; /* thread ID if error
*/
tfpregset_t thread_1; /* first thread to act on
*/
tfpregset_t thread_N; /* last thread to act on
*/
The tfpregset_t structure is defined in <sys/procfs.h> as follows:
struct tfpregset {
fpregset_t pr_fpregs; /* floating point registers
*/
tid_t pr_tid; /* the thread ID to act upon
*/
};
typedef struct tfpregset tfpregset_t;
PIOCTGREG, PIOCTSREG
The PIOCTGREG and PIOCTSREG requests are used to get and set the general
registers for one or more threads; these requests perform the same type of
functions for threads as PIOCGREG and PIOCSREG perform for the
task/process. The PIOCTSREG request requires write access to the process
file.
For PIOCTSREG, if a specified thread is not stopped on an event of
interest, the [EBUSY] error is returned.
The arguments for an ioctl() call using the PIOCTGREG and PIOCTSREG
requests are as follows:
ioctl(fd, PIOCTGREG, p) ioctl(fd, PIOCTSREG, p)
The buffer pointed to by the p argument includes the following key members:
long pr_count; /* number of threads specified
*/
tid_t pr_error_thread; /* thread ID if error
*/
tgregset_t thread_1; /* first thread to act on
*/
tgregset_t thread_N; /* last thread to act on
*/
The tgregset_t structure is defined in <sys/procfs.h> as follows:
struct tgregset {
gregset_t pr_regs; /* general registers
*/
tid_t pr_tid; /* the thread ID to act upon
*/
};
typedef struct tgregset tgregset_t;
PIOCTGRAD
The PIOCTGRAD request returns per-thread NUMA and processor-scheduling
locality information for a specified process. This request uses the
following structure:
typedef struct tradid {
int pr_radid; /* Home RAD for thread */
int pr_rad_bound; /* Thread bound to RAD? */
int pr_cpuid; /* CPU thread last ran on */
int pr_cpu_bound; /* Thread bound to CPU? */
long pad[5]; /* Reserved for future use */
tid_t pr_tid; /* Thread ID */
} tradid_t;
The following program shows an implementation of this request:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/procfs.h>
int
main(int argc, char *argv[])
{
prthreads_t *hdr;
pid_t pid;
tid_t *tidlist;
int nthreads;
char fname[80];
int i;
int fd;
int status = 0;
tradid_t *radp;
if (argc != 2) {
fprintf(stderr, "Usage: %s pid\n", argv[0]);
exit(1);
}
pid = atoi(argv[1]);
sprintf(fname, "/proc/%d", pid);
fd = open(fname, O_RDWR);
if (fd < 0) {
perror("open");
return 1;
}
if (ioctl(fd, PIOCSTOP, NULL) != 0) {
perror("ioctl(PIOCSTOP)");
status = 1;
goto restart;
}
if (ioctl(fd, PIOCNTHR, &nthreads) < 0) {
perror("ioctl(PIOCNTHR)");
status = 1;
goto restart;
}
printf("Num Threads: %d\n", nthreads);
tidlist = malloc(sizeof(tid_t) * nthreads);
if (ioctl(fd, PIOCTLIST, tidlist) < 0) {
perror("ioctl(PIOCTLIST)");
status = 1;
goto restart;
}
hdr = malloc(sizeof(prthreads_t) + (sizeof(tradid_t) * nthreads));
hdr->pr_count = nthreads;
hdr->pr_error_thread = -1;
radp = (tradid_t *)&hdr->pr_data[0];
for (i = 0; i < nthreads; i++) {
radp[i].pr_tid = tidlist[i];
radp[i].pr_radid = -1;
radp[i].pr_rad_bound = -1;
radp[i].pr_cpuid = -1;
radp[i].pr_cpu_bound = -1;
}
if (ioctl(fd, PIOCTGRAD, hdr) < 0) {
perror("ioctl(PIOCTGRAD)");
printf("\nError thread: %d\n", hdr->pr_error_thread);
status = 1;
goto restart;
}
printf(" Bound Bound\n");
printf(" TID RAD id to RAD? CPU id to CPU?\n");
printf(" --- ------ ------- ------ -------\n");
for (i = 0; i < nthreads; i++) {
printf(" %3d %2d %c %2d %c\n",
radp[i].pr_tid,
radp[i].pr_radid,
radp[i].pr_rad_bound ? 'Y' : 'N',
radp[i].pr_cpuid,
radp[i].pr_cpu_bound ? 'Y' : 'N');
}
restart:
if (ioctl(fd, PIOCRUN, NULL) != 0) {
perror("ioctl(PIOCRUN)");
status = 1;
}
return status;
}
NOTES
To wait for one or more processes to stop, /proc file descriptors can be
used in a poll() system call. A POLLPRI event is used to specify waiting
for a process or one of its threads to stop on an event of interest. When
requested and returned, the polling event POLLPRI indicates that the
process or one of its threads has stopped on an event of interest. The
polling events POLLHUP, POLLERR and POLLNVAL may be returned as well.
POLLHUP indicates that the process has terminated. POLLERR indicates that
the file descriptor has become invalid. POLLNVAL is returned immediately
if POLLPRI is requested on a file descriptor that refers to a system
process. The select() system call can be used in a similar way. When used
in a select() system call, the exceptfds parameter specifies which file
descriptors are to be checked. (See select(2).) A positive indication is
returned if the process, corresponding to the open file descriptor, has
stopped on an event of interest.
If PIOCTSTOP is invoked for a thread, and the thread is successfully
stopped, the thread can be restarted only by using PIOCTRUN; PIOCRUN has no
effect on the thread. Threads stopped on all other events of interest must
restarted by using PIOCRUN.
This reference page includes only the interesting members of the structures
defined in the <sys/procfs.h> header file and may show elements out of
order for descriptive clarity. Refer to the header file itself for complete
structure definitions.
ERRORS
In addition to the errors normally associated with file system access, the
following errors can be set by the ioctl() requests described in this
reference page:
[EAGAIN]
The operation failed because the traced process performed an exec call
on a setuid/setgid object file or on an object file that the process
cannot read; subsequent operations (except for a close() call) on the
file descriptor will fail with this error.
[EBADF]
An I/O or ioctl() call requiring write access was attempted on a file
descriptor not open for writing.
[EBUSY]
One of the following conditions was encountered:
· PIOCRUN, PIOCTRUN, PIOCSREG, PIOCTSREG, PIOCSFPREG, or PIOCTSFPREG
was applied to a process or one of its threads not stopped on an
event of interest.
· An exclusive open() was attempted on a process file already open
for writing.
· An open() for write was attempted and an exclusive open() is in
effect on the process file.
· An attempt was made to mount the /proc file system when it is
already mounted.
· PIOCDUMPCORE was applied to a process that was not stopped.
[EFAULT]
An I/O or ioctl() request referred to an invalid address in the
controlling process.
[EINTR]
A signal was received by the controlling process while waiting for the
traced process to stop.
[EINVAL]
One of the following occurred:
· An invalid argument was supplied to a system call. A non-
exhaustive list of reasons this can happen includes the following:
-- An ioctl request was applied to a file descriptor referring
to the /proc directory.
-- The specified ioctl request is undefined.
· The pr_count value used with one of the thread-specific ioctl()
requests exceeded the number of threads in the task. In this case,
the requested operation was not performed for any thread.
[EIO]
An I/O or ioctl() request referred to an invalid address in the traced
process.
[ENOENT]
The file does not exist, or its corresponding process has terminated
after being opened.
[ENOSYS]
An attempt was made to perform an operation that is not supported by
the /proc file system.
[EPERM]
The calling process does not have appropriate privilege.
FILES
/proc
The directory that contains process file identifiers.
SEE ALSO
Functions: intro(2), close(2), ioctl(2), open(2), poll(2), read(2),
setsysinfo(2), sigaction(2), signal(2), write(2)
Others: siginfo(5)
 |
Index for Section 4 |
|
 |
Alphabetical listing for P |
|
 |
Top of page |
|