2015-08-22 16 views
9

Meine Aufgabe ist es, zwei verschiedene C-Dateien zu erstellen und dann die Semaphoren für die Prozesssynchronisation zu verwenden (ich führe beide C-Dateien gleichzeitig aus).Erstellen von Semaphoren im gemeinsam genutzten Speicher in C?

Mein Hauptanliegen ist: Wenn ich auf die Semaphoren in beiden Prozessen (ausführbare Dateien der C-Dateien) zugreifen möchte, muss ich die Semaphore im Shared Memory erstellen. Ich muss auch binäre Semaphoren erstellen.

Da es mein erstes Programm ist, kann jemand vorschlagen, wie man damit anfängt?

Ich bin in der Lage, Shared Memory, verwendete Semaphore innerhalb der Threads zu erstellen und zu verwenden. Ich habe auch einige Vorträge über YouTube gesehen, konnte aber keine richtige Lösung finden.

+0

Welches Betriebssystem verwenden Sie? Wenn es, wie Linux, Semaphore hat, die zwischen Prozessen verwendet werden können, benutzen Sie das einfach. –

+0

Ich mache das auf UBUNTU –

+0

@AbhishekGangwar - Fragen Sie vor allem, wie Sie den zweiten Prozess wissen lassen, was ist die ID des gemeinsamen Speichers? –

Antwort

5

Prozessübergreifende Semaphore sind eine betriebssystemspezifische Operation.

die meisten dieser Aktien Was ist, dass Sie die Semaphore in einem Prozess über einen virtuellen Pfad erstellen , die als der Name des Semaphore Dubs. Wenn Berechtigungen richtig festgelegt sind, können Sie die das Semaphor in einem anderen Prozess öffnen, indem Sie denselben virtuellen Pfad verwenden. Diese virtuellen Pfade sind normalerweise keine echten Dateisystempfade, selbst wenn sie Ihnen bekannt vorkommen.

Auf POSIX/System V-basierten Systemen haben Sie normalerweise zwei Optionen. Die Unterschiede zwischen den beiden Optionen sind in this answer sehr gut erklärt.

System V Semaphore

Dies sind pfadbasierte Semaphore, die mit semget() erhältlich:

#include <sys/types.h> 
#include <sys/ipc.h>  
#include <sys/sem.h> 

int sem; 
int sem_id = 1; 
key_t key; 

key = ftok("/virtualpathtosemaphore", 1); 
// create a new semaphore 
sem = semget(key, 1, IPC_CREAT); 
// use sem = semget(key, 1, 0); to attach to an existing semaphore 
// flags also contain access rights, to take care to set them appropriately 

// increment semaphore 
struct sembuf semopinc = { 
    .sem_num = 0, 
    .sem_op = 1, 
    .sem_flg = 0 
};  
semop(sem, &semopinc, 1); 

/* decrement semaphore, may block */ 
struct sembuf semopdec = { 
    .sem_num = 0, 
    .sem_op = -1, 
    .sem_flg = 0 
}; 
semop(sem, &semopdec, 1); 

Beachten Sie, dass es zur Reinigung wichtig ist die Semaphore, als System-V-Semaphore um bleiben, bis explizit nicht verknüpft Was ist ein Problem, wenn ein Prozess abstürzt, ohne seine Semaphore zu bereinigen (z. B. FreeBSD kommt mit einem Dienstprogramm ipcrm entfernen Sie baumelnde System V IPC-Objekte).

POSIX Semaphore

Diese sind weniger tatsächlich weitgehend umgesetzt, so überprüfen Sie, ob Ihr Kernel unterstützt werden. Die benannte Version von diesen ist erhalten über sem_open().

POSIX-Semaphoren werden implizit zerstört, wenn der letzte Prozess mit einem Handle zum Semaphor beendet wird. Sie werden gemunkelt, seine eigene Semaphore APIs schneller zu sein als

Semaphore System V

Windows-

Windows verfügt über: Semaphore werden von CreateSemaphore() erstellt.

Windows verwendet den gleichen Namenstrick als POSIX, aber mit anderen Namespace-Konventionen.

HANDLE hSem; 
hSem = CreateSemaphore(NULL, 0, LONG_MAX, _T("Local\\PathToMySemaphore"); 

// Use OpenSemaphore() to attach to an existing semaphore 

// increment semaphore: 
ReleaseSemaphore(hSem, 1, NULL); 

// decrement semaphore 
WaitForSingleObject(hSem, 0); 

Vergessen Sie nicht, die Fehlerüberprüfung hinzuzufügen, wenn Sie die obigen Beispiele anpassen.Beachten Sie außerdem, dass ich die Berechtigungen zur Vereinfachung des Codes bewusst ignoriert habe. Vergessen Sie nicht, die entsprechenden Flags hinzuzufügen.

Zusätzlich zu all dem können Sie auch (wie häufig vor der Ankunft von echten Semaphoren üblich) Missbrauch von Dateisperren als eine Form von binärem Mutex verwenden.

3

Sie sagten, dass Sie Ubuntu GNU/Linux verwenden, so ...

Verwenden namens Semaphore!

#include <semaphore.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 

// On first process (the one that creates the semaphore) 

char semaphoreName[1 + 6 + 1]; 
semaphoreName[0] = '/'; 
semaphoreName[1 + snprintf(&semaphore[1], 6 + 1, "%d", getpid())] = '/0'; 

sem_t *sem = sem_open(semaphoreName, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0); 

// On second process 

sem_t *sem = sem_open(semaphoreName, O_RDWR); 
+0

Named Semaphore funktioniert Dank Können Sie mir helfen, binäre Semaphore zu machen was auch unter den verschiedenen Prozessen verwendet werden kann –

+0

Meinst du unbenannte Semaphoren? Natürlich müssen Sie nur eine 'sem_t' innerhalb des Shared-Memory-Bereichs deklarieren und dann' sem_init (& theSemaphoreInSharedMemory, 1, 0) '. Das zweite Argument '1' ist * sehr * wichtig (lese [sem_init (3)] (http://linux.die.net/man/3/sem_init)) – 3442

+0

Wie man ein unbenanntes Semaphor im Shared-Memory-Bereich deklariert. Sowie, wie man strenge binäre Semaphore durch das Zählen von Semaphoren erstellt –

Verwandte Themen