In den beiden beigefügten C-Programmen wurde unter Verwendung von Semaphoren ein Handshake-Mechanismus in einer Schleife programmiert.
Wenn der Schleifenzähler in beiden Programmen den Wert 32768 (= 0X7FFF) erreicht hat liefert der Aufruf von semop (...) den Wert -1 zurück,
die globale Systemvariable errno hat dann den Wert ERANGE.
Der Fehler ist immer reproduzierbar, er tritt auch in openSUSE 10.2 auf.
Mit den beiden Dateien x.c.txt und y.c.txt ist der Fehler reproduzierbar.
Vorgehensweise:
Die beiden beigefügten Dateien x.c.txt nach x.c und
y.c.txt nach y.c umbenennen,
Beide Source-Code Dateien compilieren mit
g++ -o x x.c und
g++ -o y y.c
zwei Terminal-Fenster öffnen, im ersten Terminal-Fenster mit ./x das eine Programm,
im zweiten Terminal-Fenster mit ./y das andere Programm starten:
--> Nach 32768 durchläufen liefert der Funktionsaufruf Aufruf von
...
struct sembuf semaphore;
semaphore.sem_num = semNum;
semaphore.sem_op = op;
semaphore.sem_flg = SEM_UNDO;
if( semop (semid, &semaphore, 1) == -1) {
return -1;
}
als Rückgabewert -1, die Variable errno hat den Wert ERANGE.
Zugegeben: In kommerziellen Anwendungen wird es kaum vorkommen, daß sooft die Funktion semop aufgerufen wird,
wohl aber in technischen Anwendungen, beispielsweise beim Steuern von Prozessen, etc.