---
name: "pmdaConnect"
section: "3"
platform: "linux"
package: "pcp"
version: "7.2.2-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/pmdaConnect"
---

# pmdaConnect(3)

establish a connection between a daemon PMDA and PMCD

## NAME

**pmdaConnect** - establish a connection between a daemon PMDA and PMCD

## C SYNOPSIS

**#include \<pcp/pmapi.h\>**\
 **#include \<pcp/pmda.h\>**

**void pmdaConnect(pmdaInterface \****dispatch***);**

**cc ... -lpcp\_pmda -lpcp**

## DESCRIPTION

**pmdaConnect** initializes an IPC channel between a [**PMDA**(3)](/PMDA/3.md) and the [**pmcd**(1)](/pmcd/1.md) process on the local host.  The type of the connection is dependent on the *e\_io* field of the **pmdaExt** structure:

- **pmdaPipe**

  Use **stdin**/**stdout** to communicate; assumes this is a pipe created by **pmcd** before the [**PMDA**(3)](/PMDA/3.md) was launched.

- **pmdaInet**

  Assume [**pmcd**(1)](/pmcd/1.md) will establish a connection to an IPv4 internet domain socket set up by the [**PMDA**(3)](/PMDA/3.md). The name or number of the port must be specified in the *e\_sockname* or *e\_port* fields of the **pmdaExt** structure, respectively.

- **pmdaIPv6**

  Assume [**pmcd**(1)](/pmcd/1.md) will establish a connection to an IPv6 internet domain socket set up by the [**PMDA**(3)](/PMDA/3.md). The name or number of the port must be specified in the *e\_sockname* or *e\_port* fields of the **pmdaExt** structure, respectively.

- **pmdaUnix**

  Assume [**pmcd**(1)](/pmcd/1.md) will establish a connection to a unix domain socket set up by the [**PMDA**(3)](/PMDA/3.md). The port number must be specified in the *e\_port* field of the **pmdaExt structure.**

- **pmdaUnknown**

  The initial value of *e\_io* which defaults to using **stdin**/**stdout**.

The relevant **pmdaExt** fields are initialized by [**pmdaDaemon**(3)](/pmdaDaemon/3.md) and set by [**pmdaGetOpt**(3)](/pmdaGetOpt/3.md) or [**pmdaGetOptions**(3)](/pmdaGetOptions/3.md) so most PMDAs should not need to access or modify them.

Traditionally most PMDAs have called **pmdaConnect** after calls to [**pmdaDaemon**(3)](/pmdaDaemon/3.md), [**pmdaGetOptions**(3)](/pmdaGetOptions/3.md) (or [**pmdaGetOpt**(3)](/pmdaGetOpt/3.md)) and [**pmdaInit**(3)](/pmdaInit/3.md). If the PMDA requires significant processing at startup to identify the available metrics and/or instance domains before [**pmdaInit**(3)](/pmdaInit/3.md) can be called, then it risks timing out during the handshake protocol that starts as soon as [**pmcd**(1)](/pmcd/1.md) launches the PMDA and does not conclude until **pmdaConnect** is called. In this case, it is advisable to move the **pmdaConnect** call, so that it comes *after* the call to [**pmdaGetOptions**(3)](/pmdaGetOptions/3.md) (or [**pmdaGetOpt**(3)](/pmdaGetOpt/3.md)) and *before* the call to [**pmdaInit**(3)](/pmdaInit/3.md).

## CAVEAT

The PMDA must be using **PMDA\_INTERFACE\_2** or later, as specified in the call to [**pmdaDaemon**(3)](/pmdaDaemon/3.md).

## DIAGNOSTICS

**pmdaConnect** will log the type of connection made to [**pmcd**(1)](/pmcd/1.md) if the [**PMAPI**(3)](/PMAPI/3.md) debugging option **libpmda** has been set in the global debugging specification, as described in [**pmSetDebug**(3)](/pmSetDebug/3.md).

If an error occurs that is unrecoverable, *dispatch-\>status* is set to a value less than 0, otherwise it is zero or positive.

## SEE ALSO

[**pmcd**(1)](/pmcd/1.md), [**pipe**(2)](/pipe/2.md), [**socket**(2)](/socket/2.md), [**PMAPI**(3)](/PMAPI/3.md), [**PMDA**(3)](/PMDA/3.md), [**pmdaDaemon**(3)](/pmdaDaemon/3.md), [**pmdaGetOpt**(3)](/pmdaGetOpt/3.md), [**pmdaGetOptions**(3)](/pmdaGetOptions/3.md) and [**pmdaInit**(3)](/pmdaInit/3.md).
