====== std.process ======
Prozesserzeugung und -verwaltung über POSIX-Systemaufrufe (''fork'', ''execve'', ''execvp'', ''waitpid'', ''kill''). ''spawn(prog)'' startet einen Kindprozess und gibt seine PID zurück; ''run(prog)'' wartet zusätzlich auf das Ende. ''wait_for''/''try_wait'' warten blockierend bzw. non-blocking auf den Exit-Code; ''terminate''(SIGTERM) und ''terminate_force''(SIGKILL) beenden Prozesse; ''shell(cmd)'' führt einen Shell-Befehl aus.
Einsatzbereiche: Daemon-Launcher, Build-Systeme, Prozess-Pooling, Test-Runner, Skript-Ausführung aus Lyx-Programmen.
===== Wie der Exit-Code eines Kindes ankommt =====
''run'', ''wait_for'', ''try_wait'' und ''shell'' liefern den Exit-Code **bereits ausgepackt**: Die Unit wendet intern ''(status >> 8) & 255'' an — das entspricht ''WEXITSTATUS''. Man bekommt also direkt die 0–255 und nicht den rohen ''wait''-Status.
import std.io;
import std.process;
fn main(): int64 {
PrintLn(IntToStr(shell("exit 42"c))); // 42
return 0;
}
> **Ein per Signal beendetes Kind liefert ''0'' — nicht 137 oder 143.** Bei einem Signaltod steht im ausgepackten Feld nichts; das Ergebnis ist von einem Erfolg **nicht zu unterscheiden**. Nachgemessen: ''%%shell("kill -KILL $$")%%'' ergibt ''0''.
>
> Das ''128 + n''-Schema kennt nur die Shell, die es aus der Signalinformation zusammensetzt. Wer den Unterschied braucht, lässt die Shell den Code melden (''%%shell("cmd; echo $?")%%'' und Ausgabe auswerten).
>
> Aus derselben Mechanik folgt: ''%%shell("exit 256")%%'' ergibt ''0'' — die Modulo-256-Falle wirkt auch für Kindprozesse (→ [[lyx_-_programmiersprache:sprache:exit-codes|Exit-Codes]]).
>
> ''try_wait'' benutzt zwei negative Sonderwerte: ''-2'' = läuft noch, ''-1'' = Fehler beim Warten. Sie sind keine Exit-Codes, sondern Statusmeldungen der Funktion — vor der Auswertung auf ''< 0'' prüfen.
Schlägt ''execve'' in einem mit ''spawn'' gestarteten Kind fehl, beendet sich das Kind mit **127** — dieselbe Konvention, die die Shell für „Kommando nicht gefunden" verwendet.
**Autor:** Andreas Röne\\
**Copyright:** 2024-2025 Andreas Röne
----
===== Typen =====
==== Process = int64 ====
Handle-Konvention für Prozesse:
==== ExitCode = int64 ====
Rückgabecode-Konvention für Prozesse:
----
===== Externe Funktionen =====
Extern deklarierte Funktionen (aus C-Bibliotheken):
^ Signatur ^ Beschreibung ^
| ''fork(): int64'' | Erzeugt Kindprozess als Kopie des Elternprozesses |
| ''execve(path: pchar, argv: pchar, envp: pchar): int64'' | Ersetzt Prozessabbild mit neuem Programm |
| ''execvp(path: pchar, argv: pchar): int64'' | Führt Programm über PATH-Suche aus |
| ''waitpid(pid: int64, status: int64, options: int64): int64'' | Wartet auf Statusänderung eines Kindprozesses |
| ''kill(pid: int64, sig: int64): int64'' | Sendet Signal an einen Prozess |
| ''getpid(): int64'' | Gibt Prozess-ID des aktuellen Prozesses zurück |
> **Die rohen Syscall-Bindings fehlen.** ''fork'', ''execve'', ''execvp'', ''waitpid'' und ''kill'' stehen zwar in dieser Tabelle, melden beim Aufruf aber ''undefined symbol''.
>
> Verfügbar und geprüft ist die höhere Ebene: ''spawn'', ''run'', ''wait_for'', ''try_wait'', ''terminate'', ''terminate_force'' und ''shell''.
> ([[https://github.com/SEOLizer/LyX-Compiler/issues/1246|Issue #1246]])
----
===== Konstanten =====
^ Name ^ Typ ^ Wert ^ Sichtbarkeit ^
| ''WNOHANG'' | ''int64'' | ''1'' | pub |
| ''SIGTERM'' | ''int64'' | ''15'' | pub |
| ''SIGKILL'' | ''int64'' | ''9'' | pub |
----
===== Funktionen =====
^ Signatur ^ Sichtbarkeit ^ Beschreibung ^
| ''spawn(prog: pchar): Process'' | pub | Startet Kindprozess und gibt dessen PID zurück |
| ''run(prog: pchar): ExitCode'' | pub | Startet Prozess und wartet auf Beendigung |
| ''wait_for(pid: int64): ExitCode'' | pub | Wartet blockierend auf Prozess-Ende |
| ''try_wait(pid: int64): ExitCode'' | pub | Prüft non-blocking ob Prozess beendet ist |
| ''proc_kill(pid: int64, sig: int64): int64'' | pub | Sendet beliebiges Signal an Prozess |
| ''terminate(pid: int64): int64'' | pub | Beendet Prozess mit SIGTERM |
| ''terminate_force(pid: int64): int64'' | pub | Beendet Prozess erzwungen mit SIGKILL |
| ''is_running(pid: int64): bool'' | pub | Prüft ob ein Prozess noch läuft |
| ''self_pid(): int64'' | pub | Gibt eigene Prozess-ID zurück |
| ''shell(cmd: pchar): ExitCode'' | pub | Führt Shell-Befehl aus und gibt Exit-Code zurück |