Beispielprogramm fuer z/OS UNIX System Services: Prozesserzeugung mit
fork() und spawn(), Koordination paralleler Threads mit
pthread-Mutexen (pthread_mutex_init()).
Sample for z/OS UNIX System Services: fork(), spawn() and thread
coordination with pthread mutexes. Documentation is in German.
- Der Elternprozess legt zwei Mutexe an.
- Kindprozess A entsteht per
fork(), Kindprozess B perspawnp()(das Programm startet sich selbst mit--spawn-child). Beide liefern Zahlen ueber je eine Pipe zurueck. - Zwei Reader-Threads lesen die Pipes, drei Rechen-Threads erzeugen
eigene Werte. Alle fuenf addieren auf dieselbe Summe, geschuetzt
durch den Mutex
shared.lock. - Das Programm prueft die Summe gegen den Sollwert und gibt aus, wie
oft ein Thread auf den Mutex warten musste (Buchfuehrung per
pthread_mutex_trylock(), da POSIX keine Mutex-Abfrage kennt).
Auf Nicht-z/OS-Systemen wird ersatzweise posix_spawnp() verwendet,
damit sich das Beispiel unter Linux testen laesst.
| Datei | Inhalt |
|---|---|
ussdemo.c |
Quelltext |
Makefile |
Uebersetzung mit make; tab-frei, ohne GNU-Erweiterungen |
USSDEMO.jcl |
Batch-Job: Uebersetzen und Ausfuehren per BPXBATCH |
USSDEMO-Dokumentation.docx |
Programmdokumentation mit Ablaufdiagrammen |
doc/ |
Build-Skript fuer die Dokumentation (Node.js) |
Alle Quelldateien sind tab-frei und keine Zeile ist laenger als 71 Zeichen, damit sie ISPF-Editor, FB80-Datasets und Dateitransfers unbeschadet ueberstehen.
z/OS UNIX mit xlc (Voreinstellung). make cfg erzeugt eine lokale
Compiler-Konfiguration cc.cfg, in der die Compiler-Bibliothek
(CBC.SCCNCMP) als STEPLIB eingetragen ist:
make cfg
make CFG=-F./cc.cfg
Steht CBC.SCCNCMP in LNKLST oder LPA, genuegt make.
Andere Compiler:
make CC=xlclang CFLAGS="-q64 -O2" # falls installiert
make CC=ibm-clang CFLAGS=-O2
make CC=gcc CFLAGS="-O2 -Wall -pthread" # Linux
Ausfuehren:
make run
Meldet der Compiler FSUM3221 oder FSUM3224 mit Signal 9 (Abend
EC6, Reason ....C032), fehlt das Compiler-Modul (CCNDRVR bzw.
CLCDRVR) im MVS-Suchpfad. Die Shell-Variable STEPLIB hilft nicht,
der Wert kommt nur aus dem Attribut steplib der Compiler-
Konfiguration. Details in den Kommentaren von Makefile und JCL
sowie in Abschnitt 7.2 der Dokumentation.
Auf z/OS 2.4 mit xlc uebersetzt (lokale Konfiguration cc.cfg) und
in der z/OS UNIX Shell mit _BPX_SHAREAS=YES ausgefuehrt: beide
Kindprozesse enden mit Exit-Code 0, die Summe stimmt. Die Ausgabe
dieses Laufs steht in doc/sample-output.txt. Der Batch-Weg ueber
USSDEMO.jcl (BPXBATCH, Steps COMPILE und RUN) lief ebenfalls durch.
Unter Linux (WSL, gcc 13) uebersetzt das Programm ohne Warnungen, die Summe stimmt, ThreadSanitizer meldet keine Data Races.
cd doc
npm install
npm run build
Erzeugt USSDEMO-Dokumentation.docx im Repo-Verzeichnis aus den
aktuellen Quelldateien. Die Diagramme werden mit resvg gerendert;
die Schrift Segoe UI wird vorausgesetzt (Windows).