Tutorial
[Linux] Kommunikation zwischen Programmen mit Shared Memory
von stephanbrunker | Seite 2 von 3 |
Hauptprogramm
Das Hauptprogramm ist auf das nötigste reduziert, um die Funktion zu zeigen. Zuerst wird die Initialisierung durchlaufen und der Speicher mit "Hallo" gefüllt, nachdem das Speichersegment zuerst gesperrt wurde und zum Abschluss wieder freigegeben wird:
'-----------------------------
' MAIN FUNCTION
'-----------------------------
initalise()
'----- SEMAPHORE GET ACCESS -----
if semaphore1_get_access() = 0 then
print "Shared memory get access failed"
sleep: end
end if
'----- WRITE SHARED MEMORY -----
'Write initial values
print "Got Semaphore access"
shared_memory1_pointer->some_data = "Hello" & chr(0,1,255)
print "stored=";shared_memory1_pointer->some_data
'----- SEMAPHORE RELEASE ACCESS -----
if semaphore1_release_access() = 0 then
print "Shared memory release access failed"
sleep: end
end if
print "Release Semaphore access"
In einer Do...Loop-Schleife läuft das ganze dann anders herum ab: Hier wird gecheckt, ob sich der Speicher verändert hat. Bei jedem Zugriff muss natürlich wieder gesperrt und freigegeben werden.
do
sleep 10
'----- SEMAPHORE GET ACCESS -----
if semaphore1_get_access() = 0 then
print "Shared memory get access failed"
sleep: end
end if
'----- ACCESS THE SHARED MEMORY -----
'Just an example of reading 2 bytes values passed from the php web page
'that will cause us to exit
if ((shared_memory1_pointer->some_data[8] = 30) and (shared_memory1_pointer->some_data[9] = 255)) then exit do
'----- SEMAPHORE RELEASE ACCESS -----
if semaphore1_release_access() = 0 then
print "Shared memory release access failed"
sleep: end
end if
loop until inkey = chr(27)
Der Abspann gibt dann den Semaphore und das Shared Memory wieder frei.
'----------------------------------
' EXIT MAIN LOOP - SHUTTING DOWN
'----------------------------------
'----- DETACH SHARED MEMORY -----
'Detach and delete
if shmdt(shared_memory1_pointer) = -1 then
print "shmdt failed"
sleep:end
end if
if shmctl(shared_memory1_id, IPC_RMID, 0) = -1 then
print "shmctl(IPC_RMID) failed"
sleep:end
end if
'Delete the Semaphore
'It's important not to unintentionally leave semaphores existing after program execution.
'It also may cause problems next time you run the program.
if semctl(semaphore1_id, 0, IPC_RMID) = -1 then
print "Failed to delete semaphore"
end if
end
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|
|