---
name: "Apache::SIG"
section: "3pm"
platform: "linux"
package: "libapache-mod-perl"
version: "1.29.0.4-4.1+etch1"
release: "Debian 4.0 (Etch)"
platforms: ["linux"]
url: "https://new.carta.tech/Apache::SIG"
---

# Apache::SIG(3pm)

Override apache signal handlers with Perl's

## NAME

Apache::SIG - Override apache signal handlers with Perl's

## SYNOPSIS

```
 PerlFixupHandler Apache::SIG
```

## DESCRIPTION

When a client drops a connection and apache is in the middle of a write, a timeout will occur and httpd sends a **SIGPIPE**.  When apache's SIGPIPE handler is used, Perl may be left in the middle of it's eval context, causing bizarre errors during subsequent requests are handled by that child.  When Apache::SIG is used, it installs a different SIGPIPE handler which rewinds the context to make sure Perl is back to normal state, preventing these bizarre errors.

If you would like to log when a request was cancelled by a SIGPIPE in your Apache access\_log, you can declare Apache::SIG as a handler (any Perl\*Handler will do, as long as it is run before PerlHandler, e.g. PerlFixupHandler), and you must also define a custom LogFormat in your httpd.conf, like so:

PerlFixupHandler Apache::SIG LogFormat "%h `%l` `%u` `%t` \\"%r\\" `%s` `%b` %{SIGPIPE}e"

If the server has noticed that the request was cancelled via a SIGPIPE, then the log line will end with `1`, otherwise it will just be a dash.

## CAVEATS

The signal handler in this package uses the subprocess\_env table of the main request object to supply the 'SIGPIPE' "environment variable" to the log handler. If you already use the key 'SIGPIPE' in your subprocess\_env table, then you can redefine the key like this:

$Apache::SIG::PipeKey = 'my\_SIGPIPE';

and log it like this:

LogFormat "%h `%l` `%u` `%t` \\"%r\\" `%s` `%b` %{my\_SIGPIPE}e"

## AUTHORS

Doug MacEachern and Doug Bagley

## SEE ALSO

[*perlvar*(1)](/perlvar/1.md)
