Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

[Linux] Kommunikation zwischen Programmen mit Shared Memory

von MitgliedstephanbrunkerSeite 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

 

Gehe zu Seite Gehe zu Seite  1  2  3  
Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen