---
name: "kvm_getargv"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/kvm_getargv"
---

# kvm\_getargv(3)

access user process state

## NAME

**kvm\_getprocs**, **kvm\_getargv**, **kvm\_getenvv** – access user process state

## LIBRARY

Kernel Data Access Library (libkvm, -lkvm)

## SYNOPSIS

**#include \<kvm.h\>**

**#include \<sys/param.h\>**

**#include \<sys/sysctl.h\>**

**#include \<sys/user.h\>**

*struct* *kinfo\_proc* *\**\

**kvm\_getprocs**(*kvm\_t \*kd*, *int op*, *int arg*, *int \*cnt*);

*char* *\*\**\

**kvm\_getargv**(*kvm\_t \*kd*, *const struct kinfo\_proc \*p*, *int nchr*);

*char* *\*\**\

**kvm\_getenvv**(*kvm\_t \*kd*, *const struct kinfo\_proc \*p*, *int nchr*);

## DESCRIPTION

The **kvm\_getprocs**() function returns a (sub-)set of active processes in the kernel indicated by *kd*. The *op* and *arg* arguments constitute a predicate which limits the set of processes returned. The value of *op* describes the filtering predicate as follows:

- KERN\_PROC\_ALL

  all processes and kernel visible threads

- KERN\_PROC\_PROC

  all processes, without threads

- KERN\_PROC\_PID

  processes with process ID *arg*

- KERN\_PROC\_PGRP

  processes with process group *arg*

- KERN\_PROC\_SESSION

  processes with session *arg*

- KERN\_PROC\_TTY

  processes with TTY *arg*

- KERN\_PROC\_UID

  processes with effective user ID *arg*

- KERN\_PROC\_RUID

  processes with real user ID *arg*

- KERN\_PROC\_INC\_THREAD

  modifier to return all kernel visible threads when filtering by process ID, process group, TTY, user ID, and real user ID

The number of processes found is returned in the reference parameter *cnt*. The processes are returned as a contiguous array of kinfo\_proc structures. This memory is locally allocated, and subsequent calls to **kvm\_getprocs**() and **kvm\_close**() will overwrite this storage.

The **kvm\_getargv**() function returns a null-terminated argument vector that corresponds to the command line arguments passed to process indicated by *p*. Most likely, these arguments correspond to the values passed to [exec(3)](/exec/3.md) on process creation. This information is, however, deliberately under control of the process itself. Note that the original command name can be found, unaltered, in the p\_comm field of the process structure returned by **kvm\_getprocs**().

The *nchr* argument indicates the maximum number of characters, including null bytes, to use in building the strings. If this amount is exceeded, the string causing the overflow is truncated and the partial result is returned. This is handy for programs like [ps(1)](/ps/1.md) and [w(1)](/w/1.md) that print only a one line summary of a command and should not copy out large amounts of text only to ignore it. If *nchr* is zero, no limit is imposed and all argument strings are returned in their entirety.

The memory allocated to the argv pointers and string storage is owned by the kvm library. Subsequent **kvm\_getprocs**() and [kvm\_close(3)](/kvm_close/3.md) calls will clobber this storage.

The **kvm\_getenvv**() function is similar to **kvm\_getargv**() but returns the vector of environment strings. This data is also alterable by the process.

## RETURN VALUES

The **kvm\_getprocs**(), **kvm\_getargv**(), and **kvm\_getenvv**() functions return NULL on failure.

## SEE ALSO

[kvm(3)](/kvm/3.md), [kvm\_close(3)](/kvm_close/3.md), [kvm\_geterr(3)](/kvm_geterr/3.md), [kvm\_nlist(3)](/kvm_nlist/3.md), [kvm\_open(3)](/kvm_open/3.md), [kvm\_openfiles(3)](/kvm_openfiles/3.md), [kvm\_read(3)](/kvm_read/3.md), [kvm\_write(3)](/kvm_write/3.md)

## BUGS

These routines do not belong in the kvm interface.
