Replacing the Current Program with a Different One (Perl Cookbook, 2nd Edition)

## 16.3. Replacing the Current Program with a Different One

### 16.3.1. Problem

You want to replace the running program with another, as when checking parameters and setting up the initial environment before running another program.

### 16.3.2. Solution

Use the built-in `exec` function. If `exec` is called with a single argument containing metacharacters, the shell will be used to run the program:

>     exec("archive *.data")
>         or die "Couldn't replace myself with archive: $!\n";

If you pass `exec` more than one argument, the shell will not be used:

>     exec("archive", "accounting.data")
>         or die "Couldn't replace myself with archive: $!\n";

If called with a single argument containing no shell metacharacters, the argument will be split on whitespace and then interpreted as though the resulting list had been passed to `exec`:

>     exec("archive accounting.data")
>         or die "Couldn't replace myself with archive: $!\n";

### 16.3.3. Discussion

The `exec` function in Perl is a direct interface to the execlp(2) syscall, which replaces the current program with another, leaving the process intact. The program that calls `exec` gets wiped clean, and its place in the operating system's process table is taken by the program specified in the arguments to `exec`. As a result, the new program has the same process ID (`$$`) as the original program. If the specified program couldn't be run, `exec` returns a false value and the original program continues. Be sure to check for this.

As with `system` (see Recipe 16.2), an indirect object identifies the program to be run:

>     exec { '/usr/local/bin/lwp-request' } 'HEAD', $url;

The first real argument ('`HEAD`' here) is what the new program will be told it is. Some programs use this to control their behavior, and others use it for logging. The main use of this, however, is that `exec` called with an indirect object will never use the shell to run the program.

If you `exec` yourself into a different program, neither your END blocks nor any object destructors will be automatically run as they would if your process actually exited.

### 16.3.4. See Also

The `exec` function in Chapter 29 of Programming Perl, and in perlfunc(1); your system's execlp(2) manpage (if you have it); Recipe 16.2

Copyright © 2003 O'Reilly & Associates. All rights reserved.