# pcntl_signal

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_signal — Richtet eine Signalverarbeitung ein

### Beschreibung

pcntl_signal(int `$signal`, callable|int `$handler`, bool `$restart_syscalls` = `true`): bool

Die Funktion pcntl_signal() richtet eine neue Signalverarbeitung für das in `signal` angegebene Signal ein oder ersetzt die aktuelle.

### Parameter-Liste

`signal`

  Die Signalnummer.

`handler`

  Die Signalverarbeitung. Dies ist entweder ein callable, das aufgerufen wird, um das Signal zu verarbeiten, oder eine der beiden globalen Konstanten `SIG_IGN` oder `SIG_DFL`, die das Signal ignorieren bzw. die Standard-Signalverarbeitung wiederherstellen.

  Wird ein callable übergeben, muss es folgende Signatur haben:

  handler(int `$signo`, mixed `$siginfo`): void
  `signal`
    Das zu verarbeitende Signal.
  `siginfo`
    Wenn das Betriebssystem siginfo_t-Strukturen unterstützt, ist dies ein Array von Signalinformationen, die vom Signal abhängen.

  > Hinweis:

  > Es ist zu beachten, dass die Verwendung einer Objektmethode als Signalverarbeitung den Referenzzähler des Objekts erhöht, weshalb das Objekt bestehen bleibt, bis entweder die Verarbeitung geändert wird oder das Skript endet.

`restart_syscalls`

  Gibt an, ob der Neustart von Systemaufrufen verwendet werden soll, wenn das Signal eintrifft.

### Rückgabewerte

Gibt bei Erfolg `true` zurück. Bei einem Fehler wird `false` zurückgegeben.

### Changelog

Version | Beschreibung
--- | ---
7.1.0 | Von PHP 7.1.0 an wird der Signalverbeitung ein zweites Argument übergeben, das die siginfo des spezfischen Signals enthält. Diese Daten werden nur zur Verfügung gestellt, wenn das System die siginfo_t-Struktur kennt. Wenn das Betriebssystem siginfo_t nicht implementiert, wird `null` übergeben.

### Beispiele

Beispiel #1 pcntl_signal()-Beispiel

`<?php
pcntl_async_signals(true);
// Signalverarbeitungsfunktion
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// Aufgaben zum Beenden bearbeiten
exit;
break;
case SIGHUP:
// Aufgaben zum Neustart bearbeiten
break;
case SIGUSR1:
echo "SIGUSR1 abgefangen...\n";
break;
default:
// Alle anderen Signale verarbeiten
}
}
echo "Richte Signalverarbeitung ein...\n";
// Signalverarbeitung einrichten
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// oder ein Objekt verwenden
// pcntl_signal(SIGUSR1, array($obj, "do_something"));
echo "Erzeuge signal SIGTERM an mich selbst...\n";
// sende SIGUSR1 an die aktuelle Prozess-ID
// Für posix_*-Funktionen wird die Posix-Erweiterung benötigt
posix_kill(posix_getpid(), SIGUSR1);
echo "Fertig\n"
?>`

### Anmerkungen

pcntl_signal() stapelt die Signalverarbeitungen nicht, sondern ersetzt sie.

#### Methoden zur Signalzustellung

Es gibt mehrere Methoden zur Zustellung von Signalhandlern:

- Asynchrone Zustellung mit aktivierten pcntl_async_signals(). Dies ist die empfohlene Methode
- Festlegen der Tick-Frequenz
- Manuelle Zustellung mit pcntl_signal_dispatch()

Wenn Signale asynchron oder auf tickbasierte Ausführung zugestellt werden, können blockierende Funktionen wie sleep() unterbrochen werden.

### Siehe auch

- » Signal (IPC) auf Wikipedia
- pcntl_async_signals() - Enable/disable asynchronous signal handling or return the old setting
- pcntl_fork() - Verzweigt den laufenden Prozess
- pcntl_signal_dispatch() - Calls signal handlers for pending signals
- pcntl_waitpid() - Wartet auf ein abgezweigtes Kind oder gibt dessen Status zurück

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open